【问题标题】:Native dependencies in .NET web app doesn't load.NET Web 应用程序中的本机依赖项不加载
【发布时间】:2018-09-03 22:52:40
【问题描述】:

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

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

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

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

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

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

  • 以这样的方式配置项目,使其知道在哪里寻找本地库,或者
  • 将库放在项目中的某个文件夹中,以便在加载 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文件夹中加载?

【问题讨论】:

  • 想评论否决票?
  • bin文件夹中有原生dll吗?
  • 如果您搜索 SO,您会发现至少有一个重复项说明 DLL 应位于 bin 文件夹中。是吗?

标签: c# asp.net .net native


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2020-07-08
    • 1970-01-01
    • 2012-09-13
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多