Сервер и клиент DCOM написаны на.NET
Я разрабатываю сервер DCOM в.NET 4 (VS2010, C#). Само по себе это работает нормально.
Теперь мне также нужно разработать клиент.NET для этого сервера DCOM, но я не могу добавить ссылку на TypeLib. Visual Studio сообщит мне, что библиотека типов была экспортирована из сборки.NET и не может быть добавлена в качестве ссылки.
Ответы на этот вопрос предполагают, что я должен быть в состоянии использовать TlbImp.exe
создать сборку оболочки, но она также откажется это сделать:
TlbImp: ошибка TI1029: библиотека типов "MyWrapper" была экспортирована из сборки CLR и не может быть повторно импортирована как сборка CLR.
Я понимаю, что с точки зрения чисто.NET использование DCOM для этого может не иметь большого смысла. Однако тот же сервер также должен быть доступен из приложений, отличных от.NET.
Я попытался преобразовать мой tlb в IDL и восстановить tlb из этого, но это не обманывает Visual Studio.
Возможно, можно немного изменить IDL перед регенерацией, или есть какой-то способ принудительного использования DCOM, даже если сервер и клиент написаны на.NET?
1 ответ
Мне удалось заставить работать DCOM, но я не уверен, что это можно сделать из TypeLib. Модификация IDL позволила мне импортировать библиотеку типов, но в конечном итоге это не удалось во время компиляции (хотя Visual Studio рассматривает это как предупреждение). Возможно, все еще возможно внести еще больше изменений в файл, но я использую гораздо более простое решение.
Все определения интерфейса для сервера DCOM были перемещены в отдельную сборку, на которую затем ссылается непосредственно клиент.NET. Это обходит проблему импорта.
Тогда доступ к серверу DCOM ничем не отличается от ожидаемого:
Guid clsId = new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
Type type = Type.GetTypeFromCLSID(clsId);
IMyInterface comObject = (IMyInterface)Activator.CreateInstance(type);
Перемещение интерфейсов в отдельную сборку не является строго необходимым, но это сводит к минимуму размер общей сборки.