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

Spo*_*ook 3 .net c# asp.net native

假设我们有以下应用程序结构。

  • MyApp.Web,这是一个适用于 .NET 4.7.2 的 .NET MVC 应用程序;
  • MyApp.Web使用MyApp.DataProviderWrapper程序集;
  • MyApp.DataProviderWrapper引用程序集MyApp.DataProvider(它作为二进制文件包含在 MyApp.DataProviderWrapper 的项目文件中)
  • MyApp.DataProvider对MyAppDataProcessor.dll执行 P/Invoke ,这是一个本机库,并且具有自己的本机依赖项,​​显然我也可以访问这些依赖项。

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

无法加载文件或程序集“MyAppDataProcessor.dll”或其依赖项之一。指定的模块无法找到。

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

显而易见但肮脏的解决方案是将 DLL 放在某处并将其包含到系统路径中的某处。我正在寻找更好的解决方案:

  • 以这样的方式配置项目,使其知道在哪里寻找本机库,或者
  • 将库放在项目中的某个文件夹中,加载 MyApp.DataProvider 程序集时将找到它们。

其中一种解决方案可行吗?如何在 .NET MVC 项目中使用本机库?


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

C:\ Users \ spook \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ vs \ 331a8458 \ b4c79531 \ assembly \ dl3 \ 0ae2569e \ f3fde60f_7643d401

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

Spo*_*ook 6

问题出在卷影复制机制上。它导致将具有本机依赖项的程序集复制到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" />
Run Code Online (Sandbox Code Playgroud)

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