Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET从bin文件夹加载非托管dll_C#_.net_Asp.net_Asp.net Mvc_Vb.net - Fatal编程技术网

C# ASP.NET从bin文件夹加载非托管dll

C# ASP.NET从bin文件夹加载非托管dll,c#,.net,asp.net,asp.net-mvc,vb.net,C#,.net,Asp.net,Asp.net Mvc,Vb.net,问题:我在ASP.NET中使用嵌入式Firebird数据库 现在,Firebird在本机DLL周围有一个.NET包装器 问题是,在ASP.NET编译和执行过程中,DLL会被卷影复制到临时文件夹中。不幸的是,只有.NET dll,而不是本机dll 有关详细信息,请参阅 现在,有必要将非托管dll放在system32目录(或path环境变量中的任何其他目录)的某个位置 现在,我想更改包装器/本机dll(opensource),因此如果dll仅在bin文件夹中,它也会加载dll 现在,我的问题是,在.

问题:我在ASP.NET中使用嵌入式Firebird数据库

现在,Firebird在本机DLL周围有一个.NET包装器

问题是,在ASP.NET编译和执行过程中,DLL会被卷影复制到临时文件夹中。不幸的是,只有.NET dll,而不是本机dll

有关详细信息,请参阅

现在,有必要将非托管dll放在system32目录(或path环境变量中的任何其他目录)的某个位置

现在,我想更改包装器/本机dll(opensource),因此如果dll仅在bin文件夹中,它也会加载dll

现在,我的问题是,在.NET中,如何从绝对路径加载非托管dll

绝对路径是在运行时确定的,而不是在编译时确定的…

将本机dll嵌入程序集中

Application\u Start()
上,检查
Environment.CurrentDirectory
Assembly.getExecutionGassembly().Location
或任何实际指向您想要的位置的文件,如果不存在,则通过
Assembly.GetManifestResourceStream()
将其导出

请注意,这可能会导致appdomain回收,例如重新启动应用程序,但由于您刚刚启动应用程序,因此这不是问题


不确定为什么需要绝对路径,尤其是非托管dll。如果您只需将非托管dll定位在与调用它的程序集相同的目录中,您就会轻松地获得更好的效果。

我也遇到过类似的问题,但无论出于何种原因,在调用应用程序_Start()之前,绑定/加载都会失败。我的Web是我的Web服务,它引用了我自己的另一个项目(称为CULL),它又引用了一个供应商的托管C++ DLL,它又引用了一个非托管C++ DLL。供应商管理的C++ DLL没有设置为“延迟加载”供应商的非托管DLL。这意味着,如果ASP.Net/Fusion尝试加载托管服务器,它将立即失败。只是在我的bin文件夹中有供应商的托管dll会导致.Net尝试加载它并失败

我的解决办法是

  • 创建一个生成后事件,删除供应商的托管dll(未按预期将非托管dll复制到我的bin)。这允许我的web服务启动,但如果我试图使用任何需要供应商dll的代码,它就会失败
  • 右键单击web服务并选择Add->Existing item。浏览到两个供应商dll并选择“添加为链接”(单击“添加”按钮旁边的向下箭头)
  • 在这两个新添加的供应商dll的“属性”选项卡中,使它们成为嵌入式资源
  • 现在,在
    Application\u Start
    中,我通过执行
    Path.GetDirectoryName(Assembly.GetAssembly(typeof(ATypeInMyCommonLibrary)),找到了我的公共库所在的目录使用它作为我的输出路径,我从
    汇编.getExecutionGassembly().GetManifestResourceStream
    中拉出嵌入的dll,并通过
    文件流将其写出

  • 希望这有帮助

    欢迎任何不需要我将非托管dll放入path文件夹的解决方案。绝对路径是我的想法,但嵌入肯定会更好。我最终稍微修改了这个方法。我最终有多个web项目引用了我的“公共”项目,所以我让该项目嵌入了dll,并在我的类中添加了一个静态构造函数(公共),实际上需要vedor的dll来编写它们。这样,我需要为所有web项目做的唯一一件事就是在生成后事件中删除供应商的dll。这个答案引导我走向正确的方向,但对我来说,即使托管dll与程序集位于同一临时目录中,加载程序也看不到托管dll。它只是从来没有看过那里(通过ProcMon验证)。相反,我为AppDomain.CurrentDomain.AssemblyResolve添加了一个处理程序,并使用Assembly.LoadFile显式提供位置。您可以将“Copy Local”设置为false,将其保留在bin目录之外,而不是在复制后将其删除。