none
請問C# 如何用同一支程式引用不同語言的dll例如C#或是C++ RRS feed

  • 問題

  • 請問各位大大

    1.我有2個DLL檔案,檔名和函式名稱都ㄧ樣,除了函式內容不ㄧ樣,只是一個使用C++6.0包成的DLL,另一個使用C#包成的DLL。我的系統是使用C#完成的。

    我加入C#包成的DLL只需要使用->加入參考既可以使用了。
    我加入C++6.0包成的DLL需要使用->DllImport才可以使用了。

    系統程式是固定的,DLL會變化,也就是說這個案子有可能用C#的dll但是另一個案子是用C++的dll,我要如何統一作法,可以載入各式不同語法包成的DLL檔案,但是程式不用變動。

    我的DLL會因為使用者不同而有所改變,為什麼要把DLL檔案名子取一樣,是因為系統已建構呼叫的方式。
    C#與C++裡面都有Max()函式,我希望底下程式能共用C#與C++的DLL,只要換test.DLL的版本。有什麼作法可以
    只換test.DLL版本程式碼都可以共用

    using System; 
    
    2 using System.Collections.Generic; 
    
    3 using System.Text; 
    
    4 using System.Runtime.InteropServices; 
    
    5 using "test" <-------------------------C#_DLL可以改變成其他的版本DLL,程式都不改變 
    
    6 namespace ConsoleApplication3 
    
    7 { 
    
    8  class Program 
    
    9  { 
    
    10  static void Main(string[] args) 
    
    11  { 
    
    12  test.class1 aa=new class1(); //C#_DLL 
    
    13 
    
    14  int a = 2; 
    
    15  int b = 11; 
    
    16  int c=aa.Max(a, b); //比較大小會回傳11 
    
    17 
    
    18  Console.Write("C={0}", c); 
    
    19  Console.ReadLine(); 
    
    20  } 
    
    21  } 
    
    22 } 
    
    
    
    
    2010年5月12日 上午 03:15

解答

  • 你要思考如何在用戶端程式不變的情況下,去加入或移除功能元件。
    也許 Plug-in 的設計才適合你,或是 Provider Model 之類的,但還是要看你的系統架構。

    如果只在 C# 如何 call C++ DLL 的範圍,大概沒什麼好解法,若是純 C 的 export function,你一定要用 Delcare (DllImport) 來加,或是將 C++ DLL 寫成 COM DLL,再加入參考,但這些可能都沒有太高的 extensibility,Design Pattern 也許可以給你另一種面向的思考。


    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年5月19日 上午 02:12
    2010年5月12日 上午 04:22
    版主

所有回覆

  • 再寫一個C# 的類別庫把C++ Dll 的方法包在裡面呼叫.
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月12日 上午 03:37
    版主
  • 謝謝大大回覆

    請問一下還有其他作法嗎?

    因為程式一但執行了,可以選擇適合版本的DLL怎入,如果做成類別庫呼叫要重覆寫一遍ㄧ樣的程式。

     如有十種版本,是否要寫十遍ㄧ樣的程式。


     

    2010年5月12日 上午 03:47
  • Reflection也許可以幫你解決問題.

    [.NET Framework 開發人員手冊 反映 ]


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月12日 上午 04:10
    版主
  • 你要思考如何在用戶端程式不變的情況下,去加入或移除功能元件。
    也許 Plug-in 的設計才適合你,或是 Provider Model 之類的,但還是要看你的系統架構。

    如果只在 C# 如何 call C++ DLL 的範圍,大概沒什麼好解法,若是純 C 的 export function,你一定要用 Delcare (DllImport) 來加,或是將 C++ DLL 寫成 COM DLL,再加入參考,但這些可能都沒有太高的 extensibility,Design Pattern 也許可以給你另一種面向的思考。


    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 Lolota Lee 2010年5月19日 上午 02:12
    2010年5月12日 上午 04:22
    版主
  • 謝謝大大回覆

    2010年5月12日 上午 04:24
  • 謝謝大大回覆

    2010年5月12日 上午 04:24
  • VC6 的 DLL 只能是 函數型 DLL 或 COM DLL ,C# 的 DLL 本質上是 .Net Managed DLL ,三種呼叫方式不同,不能混用。

    VBNET DLL 的才能跟 C# 的 DLL 混用。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月12日 下午 02:40
  • 謝謝大大回覆
    2010年5月13日 上午 02:06