我如何让IIS加载我的WCF服务引用的本机DLL

How do I get IIS to load a native DLL referenced by my WCF service?

本文关键字:引用 服务 本机 DLL WCF 我的 IIS 加载      更新时间:2023-10-16

我有一个WCF服务,它包含一些c#代码,它引用了一个c++/CLI dll,它引用了一些本地dll。我在我的IIS应用程序的bin文件夹中包含了所有必要的dll,但是当IIS加载托管dll时,它似乎将它们复制到一个深目录,如:

C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Filestestwcf73473be6e625098cassemblydl3aada7c3385a7332b_2f9acc01

它将每个托管DLL复制到自己的目录并加载它。当它到达我的c++/CLI DLL时,它将其复制到上面的目录,然后它无法加载依赖项。如果我手动将所有本机dll复制到这个文件夹中,它将运行,但这不是一个很好的解决方案。

我的网页。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被自动拾取?

从这篇文章来看,似乎本机dll需要在某些目录或路径上可用:

这个问题的核心原因是操作系统的方式在运行时加载本机DLL。加载本机DLL下面的逻辑也不包括临时ASP.net文件applications/bin文件夹。这个问题也会发生在任何。net如果本机DLL未包含在/bin文件夹中,则应用程序. exe文件,或者如果DLL不在路径环境变量中。

  1. 加载应用程序的目录。在…的情况下ASP。Net,这将解析为%windir%Microsoft。网# # # Framework v或%windir%system32inetsrv for iis6 .
  2. 当前目录。在ASP的情况下。Net,这将解析为%windir%System32inetsrviis6。如果使用内置web服务器,则解析为路径在C:Program FilesMicrosoft下Visual Studio 8.
  3. Windows系统目录中。使用GetSystemDirectory函数获取的路径这目录。
  4. Windows目录。使用GetWindowsDirectory函数获取该目录的路径。
  5. 目录在PATH环境变量中列出。

提供的解决方案如下:

  1. 使用DLLImport以相对或绝对路径加载dll运行时。
  2. 设置PATH环境变量,以便ASP。Net处理可以找到c++ DLL。您可以在运行时设置此属性,以便它只影响运行代码的进程。你也可以设置这个全局的系统属性(环境变量| PATH属性)。以编程方式设置此设置不需要重新启动和如果你愿意,你可以把PATH指向web应用的/bin文件夹能够对ASP进行XCopy部署。网络应用程序。在这里是从ASP.Net以编程方式设置路径的步骤。

还有一些与#2相关的更复杂的解决方案,包括以编程方式更新PATH。