簡體   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