Как получить IIS для загрузки собственной библиотеки DLL, на которую ссылается моя служба WCF? - PullRequest
9 голосов
/ 03 ноября 2011

У меня есть служба WCF, которая содержит некоторый код C #, который ссылается на DLL C ++ / CLI, которая ссылается на некоторые собственные библиотеки DLL. Я включаю все необходимые библиотеки DLL в папку bin для своего приложения IIS, но когда IIS загружает управляемые библиотеки DLL, кажется, что они копируются в глубокий каталог, например:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\testwcf\73473be6\e625098c\assembly\dl3\aada7c33\85a7332b_2f9acc01

Копирует каждую управляемую DLL в свой каталог и загружает ее. Когда он попадает в мою C ++ / CLI DLL, он копирует его в каталог, как указано выше, и затем не может загрузить зависимости. Если я вручную скопирую все собственные библиотеки DLL в эту папку, он запустится, но это не лучшее решение.

Мой web.config - это исходный файл, созданный VS, с конечной точкой, определенной на основе статьи MSDN.

<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <services>
      <service name="WcfService.Service1">
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="WcfService.IService1" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Как я могу получить эти библиотеки DLL автоматически?

1 Ответ

10 голосов
/ 03 ноября 2011

Начиная с этого поста , кажется, что собственные библиотеки DLL должны быть доступны в определенных каталогах или по пути:

Основной причиной этой проблемы является способ операционной системы загружает собственные библиотеки DLL во время выполнения. Собственные DLL загружаются с использованием следующая логика, которая не включает в себя временные файлы ASP.net, ни папка apps / bin. Эта проблема также будет возникать в любом .Net приложение, если Собственная DLL не включена в папку / bin с файл .EXE или если DLL отсутствует в переменной среды Path.

  1. Каталог, из которого загружено приложение. В случае ASP.Net, это разрешит% windir% \ Microsoft.Net \ Framework \ v ### \ или% windir% \ system32 \ inetsrv для IIS 6.
  2. Текущий каталог. В случае ASP.Net это разрешится в% windir% \ System32 \ inetsrv для IIS 6. При использовании встроенного веб-сервера это разрешает путь в C: \ Program Files \ Microsoft Visual Studio 8.
  3. Система Windows каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этот каталог.
  4. Каталог Windows. Используйте GetWindowsDirectory функция, чтобы получить путь к этому каталогу.
  5. Каталоги, которые перечислены в переменной среды PATH.

Предлагаются следующие решения:

  1. Используйте DLLImport для загрузки DLL, используя относительный или абсолютный путь в во время выполнения.
  2. Установите переменную среды PATH, чтобы процесс ASP.Net мог найдите C ++ DLL. Вы можете установить это свойство во время выполнения, чтобы оно влияет только на процесс запуска вашего кода. Вы также можете установить это глобально в свойствах системы (переменные среды | PATH имущество). Установка этого программного обеспечения не требует перезагрузки и вы можете указать путь к папке / bin веб-приложения, если хотите чтобы иметь возможность делать развертывания XCopy вашего приложения ASP.Net. Вот шаги для программного задания пути из ASP.Net.

Есть также несколько более сложных решений, связанных с # 2, которые включают программное обновление PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...