繁体   English   中英

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

[英]ASP.NET Load unmanaged dll from bin folder

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

现在,Firebird具有一个围绕本机dll的.NET包装器。

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

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

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

现在,我想更改包装器/本机dll(开源),因此,如果它们仅位于bin文件夹中,它也将加载dll。

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

将本机dll嵌入到程序集中。

Application_Start() ,检查Environment.CurrentDirectoryAssembly.GetExecutingAssembly().Location或实际指向您想要的Assembly.GetExecutingAssembly().Location的文件(如果不存在),则通过Assembly.GetManifestResourceStream()其流式传输出去。

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

不知道为什么要绝对路径,尤其是对于非托管dll。 如果仅将非托管dll与调用它的程序集放在同一目录中,则可以减轻痛苦,从而获得更好的里程。

我有一个类似的问题,但是由于任何原因,绑定/加载在调用Application_Start()之前都会失败。 我的场景是我的Web服务引用了我自己的另一个项目(称为Common),该项目又引用了供应商的托管C ++ dll,而托管C ++ dll又引用了非托管C ++ dll。 供应商的托管C ++ dll未设置为“延迟加载”供应商的非托管dll。 这意味着,ASP.Net / Fusion尝试加载托管服务器,它将立即失败。 在我的bin文件夹中只有供应商的托管dll会导致.Net尝试加载它并失败。

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

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM