C# ASP.NET从bin文件夹加载非托管dll
问题:我在ASP.NET中使用嵌入式Firebird数据库 现在,Firebird在本机DLL周围有一个.NET包装器 问题是,在ASP.NET编译和执行过程中,DLL会被卷影复制到临时文件夹中。不幸的是,只有.NET dll,而不是本机dll 有关详细信息,请参阅 现在,有必要将非托管dll放在system32目录(或path环境变量中的任何其他目录)的某个位置 现在,我想更改包装器/本机dll(opensource),因此如果dll仅在bin文件夹中,它也会加载dll 现在,我的问题是,在.NET中,如何从绝对路径加载非托管dllC# 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 现在,我的问题是,在.
绝对路径是在运行时确定的,而不是在编译时确定的…将本机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尝试加载它并失败 我的解决办法是
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目录之外,而不是在复制后将其删除。