Без регистрации COM из ASP.NET?
Windows позволяет использовать COM-объект без необходимости регистрации COM-DLL.
Механизм заключается в том, чтобы включить "зависимую сборку" в манифест приложения:
MyProgram.exe.manifest
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity type="win32" name="myapp.exe" version="1.2.3.4" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Contoso.Frobber" version="5.1.81.4" /> </dependentAssembly> </dependency> </assembly>
И тогда ваша папка содержит:
MyProgram.exe
MyProgram.exe.manifest
(если вы используете внешний манифест; также может быть встроен вRT_MANIFEST
ресурс)Contoso.Frobber.manifest
(манифест COM DLL)confrob.dll
(dll, содержащая COM-классы, которые мы хотим использовать)
с манифестом сборки COM dll, содержащим:
Contoso.Frobber.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="Contoso.Frobber" version="1.0.0.0" /> <file name = "confrob.dll"> <comClass progid="Frobber.Gizmo" clsid="{00028C00-0000-0000-0000-000000000046}" description="Gizmo Frobber by Contoso" threadingModel = "Apartment" /> <typelib tlbid="{00028C01-0000-0000-0000-000000000046}" version="1.0" helpdir=""/> </file> </assembly>
Отлично. Теперь я могу использовать COM-объект из (собственного или.NET) исполняемого файла без необходимости регистрации COM-объекта.
Теперь я хочу использовать COM-объект с веб-сайта ASP.NET без регистрации COM-объекта.
Возможный?
Бонус Болтовня
Windows также позволяет exe-файлу вызывать библиотеку.NET без необходимости устанавливать сборку.NET в глобальный кэш сборок.
2 ответа
Хотя я не могу проверить это прямо сейчас, я почти уверен, что это работает:
Если манифест для DLL является внешним, он обычно игнорируется при загрузке DLL через LoadLibrary
(по данным MSDN). Если манифест встроен в DLL, он обычно выполняется.
Вложите манифест в приложение ASP.NET (т.е. DLL с выделенным кодом) - о том, как это сделать, см. Здесь, здесь и здесь.
ОБНОВЛЕНИЕ - согласно комментариям:
Вышесказанное является обходным решением, поскольку не существует общего способа сделать это (изоляция), по крайней мере создатели ASP.NET не предполагали, что это станет возможным - например, вышеупомянутый обходной путь не будет работать в случаях, когда приложение не скомпилировать в DLL...
Недавно мы обрабатывали аналогичный случай, когда нам нужно было включить Side by Side COM(COM без регистрации) в основном приложении ASP.NET, размещенном в IIS, и мы сделали это так:
- встроить манифест в сборку (.dll)
- используйте CreateActCtx() для активации манифеста.
Этот подход отлично работает и рекомендуется группой MS .NET Runtime Interop Team.