Использование 64-битной внепроцессной COM DLL из 32-битной Windows Serivce - PullRequest
0 голосов
/ 27 марта 2020

Я выполнил шаги, упомянутые в статье,

https://www.codeproject.com/Tips/1199539/Using-64-bit-DLLs-in-32-bit-Processes-with-Out-of?msg=5709592#xx5709592xx

Создал 64-битную COM DLL (MyCOMdll.dll) и создал класс COMServer как ниже

namespace MyCOMdll
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [GuidAttribute("SOMGUID")]
    public class COMServer
    {
        public ComServer() { }

        public void TestMethod()
        {
            MathClass mathObj = new MathClass();
            mathObj.Calc();
        }
    }
}

Затем зарегистрировал MyCOMdll.dll, используя 64-разрядную версию Regasm, используя следующую команду:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm .exe MyCOMdll.dll / codebase

Затем добавлены следующие записи реестра, как описано в приведенной выше статье,

Windows Редактор реестра версии 5.00

[HKEY_CLASSES_ROOT\AppID\{GUIDOFCOMSERVER}]
"DllSurrogate"=""

[HKEY_CLASSES_ROOT\CLSID\{GUIDOFCOMSERVER}]
"AppID"="{GUIDOFCOMSERVER}"

Затем из 32-битное консольное приложение, вызывающее TestMethod, как показано ниже:

    // Access COM Object through registered Class Id
    Type ComType = Type.GetTypeFromProgID("MyCOMdll.ComServer");

    // Create an instance of the COM object
    // This will invoke the default constructor of class ComServer
    object ComObject = Activator.CreateInstance(ComType);

    // Calling the Method "TestMethod" from 64-Bit COM server
    ComType.InvokeMember("TestMethod", BindingFlags.InvokeMethod, null, ComObject, null);

Этот клиентский код работает без проблем, если он используется из 32-битного консольного приложения. Я пытался использовать этот же код из 32-битной службы windows, затем в этой строке произошел сбой, за исключением:

MathClass mathObj = new MathClass ();

Существуют ли какие-либо специальные настройки для быть сделано, когда 64-битный outpro c суррогатный dll используется из Windows Service?

1 Ответ

0 голосов
/ 27 марта 2020

В пути отсутствовали зависимости MathClass.dll. Теперь я добавил путь к каталогу (где все зависимости доступны) в переменную PATH, он начал работать. Я не уверен, почему эта проблема не возникла для консольного приложения.

...