方法有不少,這裡記錄其中的乙個方法。編譯、呼叫通過了的。期間遇到的問題是c#呼叫時傳遞string型別的引數和返回值會報錯。targetinvocationexception異常,值不在範圍內,記憶體不可訪問等等。
解決方法是;在c++的dll中將string型別的引數返回值改為lptstr型別。在c#程式中使用stringbuilder型別來傳入引數和接受返回值。
下面是**:
using system;
using system.collections.generic;
using system.linq;
using system.text;
//1. 開啟專案「tzb」,開啟類檢視,右擊「tzb」,選擇「新增」-->「類」,類名設定為「dld」,
//即dynamic loading dll 的每個單詞的開頭字母。
//2. 新增所需的命名空間及宣告引數傳遞方式列舉:
using system.runtime.interopservices; // 用 dllimport 需用此 命名空間
using system.reflection; // 使用 assembly 類需用此 命名空間
using system.reflection.emit; // 使用 ilgenerator 需用此 命名空間
public class dld
// 若已有已裝載dll的控制代碼,可以使用loaddll方法的第二個版本:
public void loaddll(intptr hmodule)
//5. 新增loadfun方法,並為了呼叫時方便,也過載了這個方法,方法的具體**及注釋如下:
///
/// 獲得函式指標
///
/// < param name="lpprocname" / > 呼叫函式的名稱
public void loadfun(string lpprocname)
///
/// 獲得函式指標
///
/// < param name="lpfilename" / > 包含需呼叫函式的 dll 檔名
/// < param name="lpprocname" / > 呼叫函式的名稱
public void loadfun(string lpfilename, string lpprocname)
//6. 新增unloaddll及invoke方法,invoke方法也進行了過載:
///
/// 解除安裝 dll
///
public void unloaddll()
///
/// 呼叫所設定的函式
///
/// < param name="objarray_parameter" / > 實參
/// < param name="typearray_parametertype" / > 實參型別
/// < param name="modepassarray_parameter" / > 實參傳送方式
/// < param name="type_return" / > 返回型別
/// 返回所呼叫函式的 object
public object invoke(object objarray_parameter, type typearray_parametertype,
modepass modepassarray_parameter, type type_return)
}if (intptr.size == 4)
else if (intptr.size == 8 )
else
il.emitcalli(opcodes.calli, callingconvention.stdcall, type_return, typearray_parametertype);
il.emit(opcodes.ret); // 返回值
mymodulebuilder.createglobalfunctions();
// 取得方法資訊
methodinfo mymethodinfo = mymodulebuilder.getmethod("init");
return mymethodinfo.invoke(null, objarray_parameter);// 呼叫方法,並返回其值
}//invoke方法的第二個版本,它是呼叫了第乙個版本的:
///
/// 呼叫所設定的函式
///
/// < param name="intptr_function" / > 函式指標
/// < param name="objarray_parameter" / > 實參
/// < param name="typearray_parametertype" / > 實參型別
/// < param name="modepassarray_parameter" / > 實參傳送方式
/// < param name="type_return" / > 返回型別
/// 返回所呼叫函式的 object
public object invoke(intptr intptr_function, object objarray_parameter,
type typearray_parametertype, modepass modepassarray_parameter,
type type_return)
}}
/*******呼叫方法******/
private void button1_click(object sender, routedeventargs e)
;type ty = new type ;
modepass mode = new modepass ;
type type_return = typeof(stringbuilder);
stringbuilder j = (stringbuilder)newdll.invoke(obj, ty, mode, type_return);
}/********c++dll中的函式*******/
extern "c" __declspec(dllexport) lptstr init(lptstr a);
lptstr init(lptstr a)
C 呼叫Delphi寫的DLL
在c 中可以這樣呼叫 呼叫 這裡需要注意的是要外傳的pchar型別引數,在c 中對應使用stringbuilder,如果使用string沒有任何資訊傳出,如果使用ref string形式,則會出現記憶體錯誤。在c 中可以這樣呼叫 呼叫 經過測試 delphi中integer的引數使用c 中的int即...
在C 中呼叫C 寫的DLL
這裡兩個問題,一是如何將c 編譯成dll,二是在c 和c 中呼叫這個dll 1,寫c 的dll,參照以下link,它說的是c 中的dll呼叫,所以肯定成功 2,寫乙個c 呼叫上面寫的dll 2.1將以上的dll拷貝到debug release目錄,然後寫c 程式如下 using system usi...
C 下呼叫C寫的dll的例子
初學c 不明白怎麼用指標呼叫c下的函式,經過一番學習,記錄如下 dll test.def library test dll exports addtest 1 addstring 2 dll 主檔案 include include include include int stdcall addtes...