.NET Web 应用程序中的本机依赖项未加载
Native dependencies in .NET web app doesn't load
比如说,我们有以下应用程序结构。
- MyApp.Web,这是适用于 .NET 4.7.2 的 .NET MVC 应用;
- MyApp.Web 使用 MyApp.DataProviderWrapper 程序集;
- MyApp.DataProviderWrapper 引用程序集 MyApp.DataProvider(作为二进制文件包含在 MyApp.DataProviderWrapper的项目文件)
- MyApp.DataProvider 执行 P/Invoke 到 MyAppDataProcessor.dll,这是一个原生库,并且有自己的本机依赖项,显然我也可以访问。
问题是,在启动网络应用程序后,我遇到了经典错误:
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 的某处。我正在寻找更好的解决方案:
- 以这样的方式配置项目,它会知道在哪里寻找本地库,或者
- 将库放在项目中的某个文件夹中,加载 MyApp.DataProvider 程序集时将找到它们。
是否有可能的解决方案之一?如何在 .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,但这是我想避免的。
比如说,我们有以下应用程序结构。
- MyApp.Web,这是适用于 .NET 4.7.2 的 .NET MVC 应用;
- MyApp.Web 使用 MyApp.DataProviderWrapper 程序集;
- MyApp.DataProviderWrapper 引用程序集 MyApp.DataProvider(作为二进制文件包含在 MyApp.DataProviderWrapper的项目文件)
- MyApp.DataProvider 执行 P/Invoke 到 MyAppDataProcessor.dll,这是一个原生库,并且有自己的本机依赖项,显然我也可以访问。
问题是,在启动网络应用程序后,我遇到了经典错误:
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 的某处。我正在寻找更好的解决方案:
- 以这样的方式配置项目,它会知道在哪里寻找本地库,或者
- 将库放在项目中的某个文件夹中,加载 MyApp.DataProvider 程序集时将找到它们。
是否有可能的解决方案之一?如何在 .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,但这是我想避免的。