.NET Web 应用程序中的本机依赖项未加载

Native dependencies in .NET web app doesn't load

比如说,我们有以下应用程序结构。

问题是,在启动网络应用程序后,我遇到了经典错误:

Could not load file or assembly 'MyAppDataProcessor.dll' or one of its dependencies. The specified module could not be found.

应用程序 运行正在 IIS Express 上运行,不幸的是试图找出系统搜索此 DLL 的位置失败,我在那里没有得到任何结果。

明显但肮脏的解决方案是将 DLL 放在某处并将其包含到系统 PATH 的某处。我正在寻找更好的解决方案:

是否有可能的解决方案之一?如何在 .NET MVC 项目中使用原生库?


更新: 在 bin 文件夹中有 DLL。但由于某种原因,其中一个程序集在 运行 期间被推送到以下文件夹:

C:\Users\spook\AppData\Local\Temp\Temporary ASP.NET Files\vs1a8458\b4c79531\assembly\dl3[=65=]ae2569e\f3fde60f_7643d401

由于它是此文件夹中的唯一文件,系统无法访问其依赖项,这些依赖项位于 bin 文件夹中,因此失败。所以问题是:为什么这个文件位于 Temporary ASP.NET Files 而不是从 bin 文件夹中加载?

您必须在 MyApp.Web 项目中添加对 MyAppDataProcessor.dll 的引用。

dll MyAppDataProcessor.dll 不在 MyApp.Web 的 bin 目录中,这就是您收到错误的原因。

问题是 卷影复制 机制。它导致将具有本机依赖项的程序集复制到 Temporary ASP.Net files 文件夹 - 从而将其与 bin 文件夹中所需的二进制文件分开。

我在这里找到了解决方案:http://faithlife.codes/blog/2013/05/using-native-dlls-from-asp-net-apps/。简而言之,将以下内容添加到 web.config 以禁用影子复制机制:

<configuration>
  <system.web>
    <hostingEnvironment shadowCopyBinAssemblies="false" />

另一个解决方案是将包含二进制文件的文件夹添加到系统 PATH,但这是我想避免的。