比如说,我们有以下应用程序结构。
问题是,在启动Web应用程序后,我遇到了经典错误:
无法加载文件或程序集“MyAppDataProcessor.dll”或其依赖项之一。指定的模块无法找到。
应用程序正在IIS Express上运行,不幸的是,尝试找出系统搜索此DLL的位置失败,我没有得到任何结果。
显而易见但又肮脏的解决方案是将DLL放在某处并将其包含在系统路径的某处。我正在寻找更好的解决方案:
解决方案之一可能吗?如何在.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文件夹加载?
您必须在MyAppDataProcessor.dll
项目中添加对MyApp.Web
的引用。
daz 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,但这是我想要避免的。