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

Chr*_*org 9 c++ iis wcf

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

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\testwcf\73473be6\e625098c\assembly\dl3\aada7c33\85a7332b_2f9acc01
Run Code Online (Sandbox Code Playgroud)

它将每个托管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>
Run Code Online (Sandbox Code Playgroud)

如何自动获取这些DLL?

Chr*_*org 10

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

导致此问题的核心原因在于操作系统在运行时加载本机DLL的方式.使用以下逻辑加载本机DLL,该逻辑不包括临时ASP.net文件和applications/bin文件夹.如果Native DLL未包含在带有.EXE文件的/ bin文件夹中,或者DLL不在路径环境变量中,则在任何.Net应用程序中也会出现此问题.

  1. 加载应用程序的目录.对于ASP.Net,这将解析为IIS 6的%windir%\ Microsoft.Net\Framework\v ### \或%windir%\ system32\inetsrv.
  2. 当前目录.对于ASP.Net,这将解析为IIS 6的%windir%\ System32\inetsrv.如果使用内置Web服务器,则解析为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属性)中全局设置它.以编程方式设置此操作不需要重新启动,如果您希望能够对ASP.Net应用程序进行XCopy部署,则可以将PATH指向Web应用程序的/ bin文件夹.以下是从ASP.Net以编程方式设置路径的步骤.

还有一些与#2相关的更复杂的解决方案涉及以编程方式更新PATH.