COM-сервер C# (используйте x86 dll в приложении x64)
Я хочу использовать библиотеку x86 в моем приложении x64 C#! На форуме я прочитал, что com объект поможет мне! Это мой ComServerSample. Компилируется как x86.
[ComVisible(true)]
public class MyComServer : IMyComSample
{
private dahuaIp.fDisConnect dissconn;
public void con(int lLoginID, StringBuilder pchDVRIP, int nDVRPort, int dwUser)
{
}
public string GetString()
{
dissconn = new dahuaIp.fDisConnect(con);
var zdsc = dahuaIp.CLIENT_Init(dissconn, 0);
return zdsc.ToString();
}
}
[ComVisible(true), Guid("DBE0E8C4-2222-41f3-B6A4-4E2F353D3D05")]
public interface IMyComSample
{
string GetString();
}
И это тестовое приложение для использования этого ком-сервера
Type CSI = Type.GetTypeFromProgID("ComServerSample.MyComServer");
var COMobj = Activator.CreateInstance(CSI);
MethodInfo method = CSI.GetMethod("GetString", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
var sdfc = method.Invoke(COMobj, null);
Когда тестовое приложение x86! Это два приложения работают нормально! Но когда тестовое приложение - x64, возникает ошибка:
Не удалось получить фабрику класса COM для компонента с CLSID {7B9F9A71-8E1B-3470-8A79-EEB4DA9B25A4} из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Как решить проблему? Мне нужно использовать мой x86 dll в приложении x64!
1 ответ
Вы получаете сообщение об ошибке "Класс не зарегистрирован", потому что вы использовали неправильную версию Regasm.exe для регистрации библиотеки классов. Или потому что вы позволили VS зарегистрировать его. Вы должны использовать 64-битную версию Regasm, она присутствует в подкаталоге c:\windows\microsoft.net\framework64.
Это, однако, не решает вашу реальную проблему, COM может только преодолеть разрядность для COM-сервера вне процесса. .NET напрямую не поддерживает их создание, только простые внутрипроцессные серверы. То, что вы получили, все равно не получится, потому что внутрипроцессный сервер должен соответствовать разрядности EXE.
Для получения COM-сервера вне процесса в.NET требуется использование COM+ и наследование от класса ServicedComponent. Статья с практическими инструкциями, которая показывает пошаговые инструкции, находится здесь.
Честно говоря, вы не впереди, делая это. Вам гораздо лучше, если вы используете.NET Remoting или WCF, чтобы ваш 64-битный процесс мог общаться с 32-битным хост-процессом, который загружает 32-битный компонент.