использование зарегистрированной библиотеки dll com-объекта из .NET
Вопрос
Я внедрил com-сервер python и сгенерировал исполняемый файл и dll с помощью py2exe tool.затем я использовал regsvr32.exe для регистрации dll.Я получил сообщение о том, что регистрация прошла успешно.Затем я попытался добавить ссылку на эту dll в .NET.Я перешел к местоположению dll и выбрал его, но я получил окно с сообщением об ошибке, в котором говорится:Не удалось добавить ссылку на dll, пожалуйста, убедитесь, что файл доступен и что это допустимая сборка или COM-компонент.Код сервера и сценарий установки добавлены ниже.Я хочу упомянуть, что я могу запустить сервер как скрипт на python и использовать его из .net, используя позднюю привязку.Есть ли что-то, чего я не понимаю или делаю неправильно?Я был бы признателен за любую помощь.
спасибо, Сара
hello.py
import pythoncom
import sys
class HelloWorld:
#pythoncom.frozen = 1
if hasattr(sys, 'importers'):
_reg_class_spec_ = "__main__.HelloWorld"
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = pythoncom.CreateGuid()
_reg_desc_ = "Python Test COM Server"
_reg_progid_ = "Python.TestServer"
_public_methods_ = ['Hello']
_public_attrs_ = ['softspace', 'noCalls']
_readonly_attrs_ = ['noCalls']
def __init__(self):
self.softspace = 1
self.noCalls = 0
def Hello(self, who):
self.noCalls = self.noCalls + 1
# insert "softspace" number of spaces
print "Hello" + " " * self.softspace + str(who)
return "Hello" + " " * self.softspace + str(who)
if __name__=='__main__':
import sys
if hasattr(sys, 'importers'):
# running as packed executable.
if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:
# --register and --unregister work as usual
import win32com.server.register
win32com.server.register.UseCommandLine(HelloWorld)
else:
# start the server.
from win32com.server import localserver
localserver.main()
else:
import win32com.server.register
win32com.server.register.UseCommandLine(HelloWorld)
setup.py
from distutils.core import setup
import py2exe
setup(com_server = ["hello"])
Решение 2
Я отвечу на свой вопрос, чтобы помочь любому, у кого могут возникнуть подобные вопросы.Я надеюсь, что это помогло бы.Я не могу найти свой сервер на вкладке COM, потому что .NET (и Visual-Studio) нужны COM-серверы с TLB.Но COM-серверы Python не имеют TLB.Итак, чтобы использовать сервер из .NET by (C # и поздняя привязка).Следующий код показывает, как это сделать:
// код на C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Type pythonServer;
object pythonObject;
pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities");
pythonObject = Activator.CreateInstance(pythonServer);
}
}
} `
Другие советы
Линия:
_reg_clsid_ = pythoncom.CreateGuid()
создает новый GUID при каждом вызове этого файла.Вы можете создать GUID в командной строке:
C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}
а затем измените свою реплику:
_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"
После внесения этого изменения я смог запустить ваш код и протестировать его с помощью следующего VBScript:
Set obj = CreateObject("Python.TestServer")
MsgBox obj.Hello("foo")
У меня нет под рукой MSVC, чтобы посмотреть, устраняет ли это проблему "добавить ссылку".
Если вы хотите использовать зарегистрированный Ком объект, вам нужно найти его на вкладке Com в Добавить ссылку диалоговое окно.Вы не переходите к библиотеке dll.