[英]Could not load file or assembly - dll from class library is not copied over to asp.net project bin folder
[英]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.CurrentDirectory
或Assembly.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嘗試加載它並失敗。
我的解決方案是這個.....
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.