2013-03-12 107 views
4

我需要將我自己的非託管C++ dll添加到Silverlight 5項目中。如何將非託管C++ dll添加到Silverlight 5項目

正如我能夠用使用它的DllImport即

[DllImport(@"D:\myLib\Debug\myLib.dll")] 
    static extern int add(IntPtr ptr); 

它正常工作,如我所提及般在一個的DllImport路徑absoulte。但我的問題是,我想使用相對路徑。

因爲我需要在我的silverlight 5項目中添加非託管C++ dll並指定從那裏的路徑。 我正在調查從最近兩天我沒有找到任何解決方案,這個問題。

只有我發現了下面提到的一個相關鏈接,但它也沒有幫助。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

,因爲它表明如何嵌入非託管的dll進入托管程序集。 我試過這種方法,但我得到「BadImageException」。

請建議過來這個問題,因爲它對我來說真的很緊迫。

感謝,

VIPIN

+0

DllImportAttribute **不會將非託管庫**嵌入到Silverlight應用程序中(通過絕對避免這種絕對路徑的方式)。它只是添加**引用到該庫**,但它必須**下載並單獨安裝**。 – 2013-03-12 14:07:36

+0

您的SL5應用程序是否使用提升的權限運行?如果沒有,我不希望能夠使用非託管DLL。 – 2013-03-12 14:09:59

+0

[BadImageFormatException](http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx)頁面有一個'備註'部分,概述了您可能會收到此錯誤的可能原因。我會通過他們看看是否有助於解決問題。 – SwDevMan81 2013-03-12 14:20:37

回答

1

當的Silverlight 5發佈候選公開後,我創建了處理捆綁非託管的非系統DLL的這個問題的一些支持方法:s的你的Silverlight 5 RC應用程序。該解決方案仍然有效,因爲微軟沒有添加任何支持來處理Silverlight 5 RTM中的捆綁問題。

我所做的基本上是將非託管DLL作爲資源文件進行捆綁。通過手動調用的輔助方法在應用程序啓動事件處理程序中,資源被複制到磁盤上的預定義位置。此位置在執行過程中也會包含在系統PATH中。

需要提高信任度(當然)。

關於此解決方案的更多詳細信息可在this博客文章中找到。

與此解決方案相關的所有代碼(包括樣品測試)均可在Github上找到。

UPDATE

如在下面的評論由西蒙Mourier指出,一個選項也將是通過調用的Kernel32LoadLibrary功能後,加載到內存(和應用程序退出時釋放)的非託管的DLL該DLL已經從資源中解壓縮。對於Silverlight的這種方法在this博客文章中有更詳細的描述。

+0

也許你可以避免在任何P/Invoke調用之前使用LoadLibrary函數(因爲你有一個有效的路徑)來改變系統PATH。一旦在該進程中加載​​了DLL,DllImport應該會成功。它曾經在標準的.NET上工作,我沒有在SL中測試過它。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175.aspx – 2013-03-13 10:35:34

+0

非常感謝評論@SimonMourier。我沒有想過這個選擇,但似乎可行。簡單的Google搜索表明,其他人實際上已經在SL中成功實施了這種方法。我將用這個新信息更新答案。 – 2013-03-13 11:07:02