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

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

现在,Firebird在本地dll上有一个.NET包装器。

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

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms366723.aspx。

现在,这使得必须将非托管dll放到system32目录(或路径环境变量中的任何其他目录)中。

现在,我想更改包装器/原生dll(opensource),因此如果它们只在bin文件夹中,它也会加载dll。

现在,我的问题是,如何在.NET中从绝对路径加载非托管dll?
绝对路径是在运行时确定的,而不是在编译时...


将本地dll嵌入到您的程序集中。

Application_Start() ,检查Environment.CurrentDirectoryAssembly.GetExecutingAssembly().Location或任何实际指向的Assembly.GetExecutingAssembly().Location ,对于该文件,如果不存在,则通过Assembly.GetManifestResourceStream()其流出。

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

不知道为什么你想要一个绝对路径,尤其是一个非托管的DLL。 如果您只是将非托管dll与调用它的程序集放在同一目录中,您将获得更好的里程数,而且痛苦更轻。


我有类似的问题,但是无论什么原因,在调用Application_Start()之前绑定/加载都会失败。 我的scenerio是我的web服务引用了我自己的其他项目(Called Common),后者又引用了供应商的托管C ++ dll,后者又引用了非托管C ++ dll。 供应商的托管C ++ dll未设置为“延迟加载”供应商的非托管dll。 这意味着ASP.Net/Fusion试图加载托管的,它会马上失败。 只需让我的bin文件夹中的供应商管理的dll导致.Net尝试加载它并失败。

我的解决方案是......

  • 创建一个POST构建事件,删除供应商的托管dll(非托管未按预期方式复制到我的bin)。 这允许我的Web服务启动,但如果我尝试使用任何需要供应商的DLL的代码,它将会失败。
  • 右键单击Web服务,然后选择Add-> Existing项目。 浏览到两个供应商的DLL并选择“添加为链接”(点击添加按钮旁边的向下箭头)。
  • 在新添加的供应商dll的属性选项卡中,使它们成为嵌入式资源。
  • 现在,在Application_Start ,我通过执行Path.GetDirectoryName(Assembly.GetAssembly(typeof(ATypeInMyCommonLibrary)));查找我的公共库所在的目录Path.GetDirectoryName(Assembly.GetAssembly(typeof(ATypeInMyCommonLibrary))); 使用它作为我的输出路径,我将嵌入式dll从Assembly.GetExecutingAssembly().GetManifestResourceStream中取出,并通过FileStream写出。
  • 希望这可以帮助!

    链接地址: http://www.djcxy.com/p/44531.html

    上一篇: ASP.NET Load unmanaged dll from bin folder

    下一篇: Unmanaged DLLs fail to load on ASP.NET server