背景
原始**是c#form呼叫c#的dll,現因為需要將**搬遷到linux中,需要先將c#的dll轉為c++dll,因為c#的form暫時不方便搬遷,需要先轉後的c++dll,也就是需要c#呼叫c++dll,原來的c#呼叫c#dll的呼叫耦合度較高,有對類成員變數和類函式的呼叫,
現對呼叫過程進行總結,如果有不合適的地方,希望大家指正
總結呼叫方法有兩種,一種是建立c++ clr專案,對c++**進行封裝,可以參考
另一種方法,c#直接呼叫c++dll,在呼叫時,c++dll可以直接匯出全域性介面,也可以匯出類,我們例子中使用全域性介面的方法,因為對dll的改動較小,方便維護
舉例如下:
建立c++dll
class ctest1
;ctest1(int x, int y);
int a;
int b;
public:
int add(int x, int y);
};extern "c" testdll_api ctest1 * getobj(int x, int y) ;
extern "c" testdll_api int test1_add(ctest1 * obj, int x, int y) ;
ctest1::ctest1(int x, int y)
int ctest1::add(int x, int y)
;c#**
[dllimport("dll1.dll", charset = charset.ansi, callingconvention = callingconvention.cdecl)]
public extern static intptr getobj(int x, int y);
[dllimport("dll1.dll", charset = charset.ansi, callingconvention = callingconvention.cdecl)]
public extern static int test1_add(intptr obj, int x, int y);
private intptr obj;
public void setobj()
public int test1add()}}
c# 呼叫**
class1 mytest = new class1();
int x = mytest.test1add();
例子有點low,但大概流程是這樣
注意點1 c++中返回的資料不能是棧空間的區域性變數,否則返回值與設定的值會不一樣
2 返回的陣列在c#中需要轉為,例子如下
[dllimport("dll1.dll", charset = charset.ansi, callingconvention = callingconvention.cdecl)]
public extern static intptr test_retarry(intptr obj, ref int len);
public int retarry()
開發過程中遇到的問題總結:
1 c#需要使用c++中的類,c++中的定義不變,可以定義乙個類指標即可,在c#中使用intptr型別接收此類指標,類的其餘方法或者變數可以將此類指標作為傳入傳入,在c++中呼叫對應的方法
2 c++中的陣列型別,在c++介面中改為指標型別,c#中使用intptr接收,並轉為指標即可,參上上面注意點中的內容
3 c++string型別,改為char*, c#中仍然使用string,不需要改變
[dllimport("simulatordll.dll", charset = charset.ansi, callingconvention = callingconvention.cdecl)]
private extern static intptr start(intptr pobj, intptr config);
public string start(intptr config)
C 呼叫C DLL 總結
當然在c 這樣定義之前要定義結構體,結構體的變數,函式要一樣。c 中的結構體是這樣的 struct stlencodedeviceinfo c 中的定義 structlayout layoutkind.sequential,charset charset.unicode public struct ...
c 呼叫C dll 的方法
c 呼叫c dll 的方法 1.新增 using system.runtime.interopservices 2.將dll 放到執行程式的根目錄下 3.c 中可識別的字元為 utf8,在傳輸字元的時候,需要先轉換為utf8,然後再傳輸,要不然中文會識別不了,同樣在返回資料的時候,也需要將utf8轉...
C 呼叫C dll問題總結
開發乙個介面需要用c 呼叫c 的介面,總結一些自己在呼叫介面時遇到的問題以及解決方法與大家共同學習 呼叫的引入 1.c 呼叫c dll時需要使用 using 或者使用 using dll 進行包含所使用的dll 2.使用using namespace 程式集 assembly 類名 classnam...