【问题标题】:How do I get IIS to load a native DLL referenced by my WCF service?如何让 IIS 加载我的 WCF 服务引用的本机 DLL?
【发布时间】:2011-12-21 05:29:09
【问题描述】:

我有一个 WCF 服务,其中包含一些 C# 代码,它引用了一个 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 被自动提取?

【问题讨论】:

  • web.config 的内容将有助于更好地理解它
  • 是的,看不出有什么问题,您的 AppPool 是否启用了 32 位?您可以在 IIS\Application Pools 下找到您的应用程序池,然后选择一个您正在运行 Web 应用程序的应用程序池
  • 所有 DLL 都编译为 x64,问题与此无关。当我将它们放在 ASP.NET 创建的托管 DLL 旁边时,它们可以正常加载。我只需要 ASP.NET 从加载所有托管 DLL 的 bin 目录中获取它们。

标签: c++ wcf iis


【解决方案1】:

this post看来,本地DLL似乎需要在某些目录或路径上可用:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多