Способ сделать то, что вы пытаетесь сделать, - это перевести определения IDL в интерфейсы C #, а затем реализовать эти интерфейсы как классы C #.Вы применяете соответствующие атрибуты (в основном ComVisible , ClassInterface и ProgId ) к классам, которые вы хотите открыть для COM, и используете инструмент regasm
длязарегистрируйте свою сборку как COM-сервер.
Перевод IDL в C # на самом деле не так уж и сложен;по большей части он сопоставляется довольно просто из ключевых слов IDL с ключевыми словами C # и / или MarshalAs
атрибутами.У меня есть серия постов в блоге о том, как сделать COM-взаимодействие без tlbimp
, в том числе о , как читать IDL .Я не знаю ни одного инструмента, в частности, который бы хорошо справлялся с этой задачей, но если он входит в состав Windows SDK, вы всегда должны сначала проверять pinvoke.net на тот случай, если кто-то другой сделает это за вас.
Что касается других ваших вариантов, то 3 и 4 означают примерно одно и то же.Вы не можете вызывать управляемый код напрямую из неуправляемого кода, если это не сделано через COM Interop или библиотеку C ++ в смешанном режиме.В первом случае вам все равно придется решить все проблемы с регистрацией вашей сборки C # в COM для вызова Cll, так что вы можете также пропустить посредника.Во-вторых, вы в основном выполняете вручную те же действия, что и код взаимодействия во время выполнения, и используете язык, с которым вы менее знакомы, для загрузки, что для меня кажется чистым убытком.
Beоднако следует помнить, что загрузка сборок .NET в неуправляемый контекст не всегда возможна;например, управляемые расширения оболочки явно не поддерживаются в Windows 2008. Я не знаю, позволит ли интерфейс TSSBX загружать управляемые сборки как объекты COM или нет, так что вам придется знать об этой возможности.Если вы не можете, тогда ни один из ваших вариантов не сработает, и вам придется вообще избегать использования .NET Framework, использовать другие технологии доступа к базам данных и писать весь проект на неуправляемом C ++.