Я выполнил шаги, упомянутые в статье,
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?