2011-09-14 54 views
3

Silverlight 5爲我們提供了一個很棒的功能。這是P/Invoke(平臺調用)。該功能可以從系統DLL中調用函數。但是我需要使用未爲Silverlight編譯的「.NET DLL」。我如何通過P/Invoke或其他方式來做到這一點? P.S.我的應用程序是「可信」的「瀏覽器內」應用程序。Silverlight 5和dll

更新: 我有一個特定的庫與麥克風的按鈕進行交互。我在.NET應用程序中將它用作通常的「.NET DLL」(即,我將它添加爲引用並使用它的類)。當我知道P/Invoke時,我決定嘗試在Silverlight應用程序中使用它,但我還沒有理解如何通過P/Invoke來實現。

回答

1

我不跟着你。

你到底有哪個問題?

如果你想使用的PInvoke來調用Windows API,比如,你可以做這樣的事情:

using System; 
using System.Runtime.InteropServices; 


namespace MySilverlightApplication 
{ 
    public class PlatformInvokeTest 
    { 
     [DllImport("kernel32.dll")] 
     public static extern bool Beep(int frequency, int duration); 


     public static void PlaySound(int frequency, int duration) 
     { 
      Beep(frequency, duration); 
     } 
    } 
} 

如果你有一個.NET的DLL(組裝),這是不是一個SL項目或SL控制庫,你可以嘗試PInvoke它,但通常你通過WCF或其他渠道公開其服務。我明白你在瀏覽器外面可能想斷開連接...你能告訴我們更多關於你的具體需求嗎?

看到這篇文章在這裏順便說一句:How to use PInvoke in Silverlight 5

+0

是的,這很好。但這不是我想要的。我更新了問題。 – Ilya

3

這在很大程度上取決於您的方案的細節。調用完整.NET組件的唯一方法是通過COM。如果.NET組件公開API,則需要使用COM,然後可以使用AutomationFactory來獲取它(也可以在SL4中執行此操作)。

如果它沒有COM可訪問的API,那麼也許你可以安裝自己的dll,爲原始dll創建一個COM可訪問類的集合,或者如果有問題的dll是你自己的代碼,你可以修改它爲COM可訪問。當然,這假定你有能力在客戶端機器上安裝某些東西,如果沒有,那麼你就會陷入困境。

1

我想我遇到過類似的問題。我已經通過將我的本機DLL作爲資源捆綁在Silverlight應用程序XAP中解決了這個問題,並且在啓動應用程序時,我讓應用程序將DLL複製到我的計算機上的本地目錄,並將本地目錄添加到系統路徑中,運行。

我描述了我的解決方案更廣泛地在這個博客帖子:http://cureos.blogspot.com/2011/09/pinvoke-bundling-native-dlls-in.html

我希望這能解決你的問題。祝你好運!

Anders @ Cureos

+0

偉大的解決方案!正如您已經提到的那樣,我們應該希望Microsoft能夠修復Silverlight 5的RTM版本中的本機DLL路徑問題。 – Mike