использование зарегистрированной библиотеки dll com-объекта из .NET

StackOverflow https://stackoverflow.com/questions/1083913

  •  23-08-2019
  •  | 
  •  

Вопрос

Я внедрил 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top