1

我创建了一个带有 WCF 服务的 .NET Framework 4.7.2 网站。要通过此服务公开数据,我必须从 C:\InstallLocation 引用 Copy Local = False 的第三方 DLL。该网站在运行时加载此 DLL,但在访问 DLL 中要求它在同一 InstallLocation 文件夹中加载辅助 DLL 的功能时出现错误。我用 Process Monitor 验证了 W3WP.exe 在 C:\InstallLocation 中找到了主 DLL,但 W3WP.exe 根本无法在 C:\InstallLocation 中查找辅助 DLL。应用程序错误是预期的,

无法加载文件或程序集“[assembly-info-ommitted]”或其依赖项之一。该系统找不到指定的文件。

我还在控制台应用程序中测试了完全相同类型的引用,它没有问题。进程监视器显示在 C:\InstallLocation 中查找辅助 DLL 的可执行文件。

有没有办法配置 .NET Web 应用程序以允许进程在与引用的主 DLL 相同的目录中查找?我尝试了以下但没有(完全)成功:

  • 将 C:\InstallLocation 添加到我的系统路径(并重新启动)。好像没什么影响。我在应用程序启动时验证了添加的路径确实出现在 Environment.GetEnvironmentVariable("PATH") 中。
  • 将 C:\InstallLocation 移至我的 Web 根目录并尝试 <probing privatePath="CopiedLocation"。这解决了最初的 DLL 引用问题,但仍然显示错误,但依赖于不同的 DLL。我不认为这将是一个可行的解决方法。
  • 电影 C:\InstallLocation 到 bin 文件夹并注释掉。结果与上述相同。
  • 授予应用程序池用户对 C:\InstallLocation 的完全权限。用户:IIS APPPOOL\{网站名称}、IUSR、IIS_IUSRS

编辑

我已经实现了一个初始化程序,如此处所示,https://stackoverflow.com/a/16867088/2544926。我已更改代码以检查 C:\InstallLocation 中是否存在 DLL 以从该文件夹加载 DLL。从进程监视器的输出来看,这似乎让我更接近了。但是,我在此过程的后期看到了一个错误。这是我现在看到的错误(多级异常)。

'<Module>' 的类型初始化程序引发了异常。

在导致 C++ 模块加载失败的主要异常之后发生了嵌套异常。

'<Module>' 的类型初始化程序引发了异常。

C++ 模块在 vtable 初始化期间无法加载。

无法加载文件或程序集“XYZ,Version=NNNNN,Culture=neutral,PublicKeyToken=NNNNNNNNN”或其依赖项之一。该系统找不到指定的文件。

有趣的是,在我的自定义 Assembly Initializer 代码中,我看到 XYZ.DLL 是从 C:\InstallLocation 加载的。这个 C++ 模块是否可能试图以不同的方式或以 ASP.NET 不支持的方式加载它?

4

0 回答 0