我有一个包含一些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
它将每个托管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?
答案 0 :(得分:10)
从this post开始,似乎原生DLL需要在某些目录或路径上可用:
此问题的核心原因在于操作系统的方式 在运行时加载本机DLL。使用。加载本机DLL 以下逻辑不包括临时ASP.net文件也没有 applications / bin文件夹。任何.Net也会出现此问题 应用程序,如果本机DLL不包含在/ bin文件夹中 .EXE文件或DLL不在路径环境变量中。
- 加载应用程序的目录。如果是 ASP.Net,这将解析为%windir%\ Microsoft.Net \ Framework \ v ### \ 或%windir%\ system32 \ inetsrv for IIS 6。
- 当前目录。在ASP.Net的情况下,这将解析为%windir%\ System32 \ inetsrv 对于IIS 6.如果使用内置Web服务器,则会解析为路径 在C:\ Program Files \ Microsoft Visual Studio 8下。
- Windows系统 目录。使用GetSystemDirectory函数获取路径 这个目录。
- Windows目录。使用GetWindowsDirectory 函数来获取此目录的路径。
- 目录 列在PATH环境变量中。
醇>
提供的解决方案如下:
- 使用DLLImport使用相对或绝对路径加载dll 运行时。
- 设置PATH环境变量,以便ASP.Net进程可以 找到C ++ DLL。您可以在运行时设置此属性以便它 仅影响运行代码的进程。你也可以设置它 全局在系统属性(环境变量| PATH 属性)。以编程方式设置此不需要重新启动和 如果需要,可以将PATH指向Web应用程序的/ bin文件夹 能够对ASP.Net应用程序进行XCopy部署。这里 是从ASP.Net以编程方式设置路径的步骤。
醇>
还有一些与#2相关的更复杂的解决方案涉及以编程方式更新PATH。