C 呼叫C 寫的DLL

2021-06-27 19:18:46 字數 3225 閱讀 5797

方法有不少,這裡記錄其中的乙個方法。編譯、呼叫通過了的。期間遇到的問題是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...