Когда мы меняем роль 32-битной и 64-битной систем в решении Саймона Мурье, тогда - помимо изменения битности компиляции - мы должны изменить 4 вещи.
(1) изменениерегистрация
с
%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe NetComClassLibrary3.dll /codebase /tlb
на
%windir%\Microsoft.NET\Framework\v4.0.30319\regasm.exe NetComClassLibrary3.dll /codebase /tlb
(2) изменение элементов реестра
с
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AppID\{31dd1263-0001-4071-aa4a-d226a55116bd}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOT\CLSID\{31dd1263-0001-4071-aa4a-d226a55116bd}]
"AppID"="{31dd1263-0001-4071-aa4a-d226a55116bd}"
до
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\AppID\{31dd1263-0001-4071-aa4a-d226a55116bd}]
"DllSurrogate"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{31dd1263-0001-4071-aa4a-d226a55116bd}]
"AppID"="{31dd1263-0001-4071-aa4a-d226a55116bd}"
(3) В 64-разрядном клиенте вместо регистрации 32-разрядного NetComClassLibrary3.dll скопируйте определения IMyClass
и OnMyEventDelegate
в исходный код клиента
(4) Также в клиенте
изменить
var type = Type.GetTypeFromCLSID(typeof(MyClass).GUID);
на
var type = Type.GetTypeFromProgID("NetComClassLibrary3.MyClass");
, поэтому клиент будет выглядеть так:
using System;
// removed by mma - using NetComClassLibrary3; // we can reference the .net dll as is
namespace ConsoleApp10
{
// inserted by mma:
[System.Runtime.InteropServices.Guid("31dd1263-0002-4071-aa4a-d226a55116bd")]
public interface IMyClass
{
event OnMyEventDelegate OnMyEvent;
object MyMethod();
}
[System.Runtime.InteropServices.Guid("31dd1263-0002-4071-aa4a-d226a55116bd")]
public delegate void OnMyEventDelegate(string text);
// end of insertion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bitness: " + IntPtr.Size);
// note we don't use new MyClass() otherwise we may go inprocess
// removed by mma var type = Type.GetTypeFromCLSID(typeof(MyClass).GUID);
// inserted by mma:
var type = Type.GetTypeFromProgID("NetComClassLibrary3.MyClass");
// end of insertion
var obj = (IMyClass)Activator.CreateInstance(type);
// note I'm using the beloved dynamic keyword here. for some reason obj.OnMyEvent works but locally raises a cast error I've not investigated further...
dynamic d = obj;
d.OnMyEvent += (OnMyEventDelegate)((t) =>
{
Console.WriteLine(t);
});
Console.WriteLine(obj.MyMethod());
}
}
}
и поэтому выходной сигнал изменится с
Bitness: 4 // running as 32-bit
MyEvent. MyMethod. Bitness: 8 Pid: 23780 Name: dllhost // from 64-bit world
MyMethod. Bitness: 8 Pid: 23780 Name: dllhost // from 64-bit world
на
Bitness: 8 // running as 64-bit
MyEvent. MyMethod. Bitness: 4 Pid: 56140 Name: dllhost // from 32-bit world
MyMethod. Bitness: 4 Pid: 56140 Name: dllhost // from 32-bit world
Примечание Добавление определений IMyClass
и OnMyEventDelegate
в исходный код клиента вместо регистрации 32-разрядного NetComClassLibrary3.dll работает также на 32-разрядном клиенте + 64-разрядной версии COM-сервера,но референцПри использовании 32-битной COM-библиотеки в 64-битном клиенте возникает исключение BadImageFormat.