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

问题描述 投票:0回答:2

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

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

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

无法加载文件或程序集“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文件夹中,因此失败。所以问题是:为什么这个文件落在Temporary ASP.NET Files而不是从bin文件夹加载?

c# asp.net .net native
2个回答
0
投票

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

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


0
投票

问题是影子复制机制。它导致具有本机依赖关系的程序集被复制到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,但这是我想要避免的。

© www.soinside.com 2019 - 2024. All rights reserved.