代码之家  ›  专栏  ›  技术社区  ›  Spook

未加载.NET web app中的本机依赖项

  •  0
  • Spook  · 技术社区  · 6 年前

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

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

    问题是,在启动web应用程序之后,我会遇到一个典型的错误:

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

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

    显然,但肮脏的解决方案是将dll放在某个地方,并将其包含到系统路径的某个地方。我正在寻找更好的解决方案:

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

    有可能的解决办法吗?如何在.NETMVC项目中使用本机库?


    更新: 在bin文件夹中有dll。但由于某些原因,在运行期间会将其中一个程序集推送到以下文件夹:

    C:\Users\spook\AppData\Local\Temp\Temporary ASP.NET Files\vs\331a8458\b4c79531\assembly\dl3\0ae2569e\f3fde60f\u 7643d401

    由于它是此文件夹中的唯一文件,系统无法访问其依赖项,这些依赖项位于bin文件夹中,因此失败。所以问题是:为什么这个文件会在 Temporary ASP.NET Files 而不是从bin文件夹加载?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Nitin S    6 年前

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

    动态链接库 MyAppDataProcessor.dll 不在的bin目录中 我的应用程序.Web 这就是你犯错误的原因。

        2
  •  0
  •   Spook    6 年前

    问题是 卷影复制 机制。它导致将具有本机依赖项的程序集复制到 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" />
    

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