Без регистрации 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, и мы сделали это так:

  1. встроить манифест в сборку (.dll)
  2. используйте CreateActCtx() для активации манифеста.

Этот подход отлично работает и рекомендуется группой MS .NET Runtime Interop Team.

Другие вопросы по тегам