gpt4 book ai didi

c# - .NET Web 应用程序中的 native 依赖项未加载

转载 作者:行者123 更新时间:2023-12-02 20:20:03 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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


更新:确实在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 文件夹加载?

最佳答案

问题出在卷影复制机制上。它导致具有 native 依赖项的程序集被复制到临时 ASP.Net 文件文件夹 - 从而将其与 bin 文件夹中所需的二进制文件分开。

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

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

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

关于c# - .NET Web 应用程序中的 native 依赖项未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com