2010-10-26 66 views
1

從C#應用程序鏈接到C#DLL函數的正確方法是什麼?從C#應用程序鏈接函數到C#DLL

這是我的DLL的樣子:

namespace WMIQuery_Namespace 
{ 
    public class WMIQuery 
    { 
     public static string GetPortName() 
     { 
      /* Does some stuff returning valid port name. */ 

      return string.Empty; 
     } 

     public static int ScanForAdapters() 
     { 
      /* Does some stuff returning valid adapter index. */ 

      return _index = -1; 
     } 
    } 
} 

這是在我的應用程序界面的外觀:

namespace MyApp_Namespace 
{ 
    class MyApp_Class 
    { 
     internal static class WMIQuery 
     { 
      [DllImport("WMIQuery.dll")] 
      internal static extern string GetPortName(); 

      [DllImport("WMIQuery.dll")] 
      internal static extern int ScanForAdapters(); 
     } 
    } 
} 

編譯沒有任何錯誤或警告,但是當我試圖把這些從我的應用功能則拋出該異常:

「無法找到名爲切入點DLL中的'ScanForAdapters' 'WMIQuery.dll'。「

我在做什麼錯?我知道我可以添加WMIQuery作爲參考,但我需要將它作爲非託管DLL鏈接。謝謝。

+1

你一定要鏈接它,或者你可以導入DLL引用到Visual Studio項目? – 2010-10-26 15:20:04

+0

@Daniel:爲了清晰起見,我更新了問題。它需要被鏈接。 – 2010-10-26 15:32:10

+1

如果你可以解釋爲什麼你不想添加'WMIQuery'作爲參考,它會更容易回答。 – egrunin 2010-10-26 15:49:44

回答

8

如果DLL是C#DLL,則不要使用P/Invoke來「鏈接」它。

只需將其添加爲您的項目的引用,並添加,在類的頂部要使用它:

using WMIQuery_Namespace; 

然後,您可以直接做:

var port = WMIQuery.GetPortName(); 

無需在「客戶」方面在所有的任何代碼...


至於:

但是應用程序的要求要求它在運行時動態加載。謝謝。

認識到程序集將不會被加載,直到您的應用程序使用它的時間點。 CLR中的程序集在啓動時不加載,而是在程序集中使用第一個類型時。沒有必要嘗試通過P/Invoke加載它以實現後期綁定。

如果您不相信這一點,您可以始終使用Assembly.Load和反射來調用成員,但平臺調用服務將無法加載C#程序集。

+0

好奇 - 爲什麼downvoting?您不能P /調用C#DLL ... – 2010-10-26 15:26:31

+0

我在問題中特別提到應用程序的要求要求它在運行時動態加載; 'WMIQuery'不能作爲參考添加,這是實現'使用WMIQuery_Namespace'所必需的。 – 2010-10-26 15:27:13

+0

@Jim:我只是編輯了我的答案,以解釋爲什麼...... – 2010-10-26 15:28:44