如果是非托管的,,就用DllImport,舉例 using System; using System.Runtime.InteropServices; class MainApp [DllImport("Kernel32")] //讀取動態(tài)庫文件 public static extern int GetProcAddress(int handle, String funcname);
給你講一下我的經(jīng)驗: 首先 你在C#中調(diào)用的 是C++ 寫的一個動態(tài)庫,。比如Kernel32.dll 中的 函數(shù),; 這個函數(shù)用C++寫 有如下要求: 1、 必須為全局函數(shù) 2,、 函數(shù)參數(shù) 必須為基本類型,,也就是C++ 和C#都有的類型,否則你在public static extern int GetProcAddress(int handle, String funcname); 這里沒有辦法聲明,。 其余的 沒什么了,;
先前用VC寫的程序生成的DLL,C#里能夠調(diào)用么,? 可以的話,,在VC里傳入?yún)?shù)為CString,而C#里是string,,怎么傳參數(shù)呢,?
再者就是問,用VC寫的DLL如果是一個導(dǎo)出類,,而不是函數(shù)接口,,C#里可以直接調(diào)用么,? 第一個問題我遇到過, 可用如下方法解決:
VC++ 中為: int Set(char** str,int n); //將 String 改成 char** , C# 中沒有與String對應(yīng)的類型 C# 中為: int Set(ref string str,int n); VC++ 中的 BOOL 類型對應(yīng) C# 中的 System.Int32 類型, 建議改動一下參數(shù)類型吧.
第二個問題,,生成的DLL里的函數(shù)在一個類里面,這樣的話在C#里需要實例化那個類么,?怎么做 比如說,,類solution里有函數(shù)int getch(int a); 我怎么調(diào)用這個getch函數(shù)?,?
建議在C++中另外寫個函數(shù)封裝一下, 如: int Dllgetch(int a) { solution st = //實例化 類solution return st.getch(a); } 這個 Dllgetch(int a) 就可以提取出來供 C# 調(diào)用. 你的方法可以,,我也解決了 將CString 改成了LPCTSTR BOOL在C#中對應(yīng)的是Boolean
****************************上段摘自jingshuaizh回復(fù)提問者的答案,講得很詳細(xì)**********************
還有你可以參考這里:http://blog.csdn.net/jingshuaizh/archive/2009/02/04/3862019.aspx
DLL文件放置位置:
(1)項目文件夾下的../bin/Debug/
(2)系統(tǒng)文件夾下的C:/WINDOWS/system32
如果能確定位置是正確的,,那么就得看看是不是你調(diào)用的DLL文件是不是使用到其他DLL文件里的內(nèi)容,,這點很關(guān)鍵,在找不到其他問題的情況下這種情況的可能性高過百分之九十,,這只是我遇到的情況,,要是有其他情況,可以發(fā)來一起討論,。,。。
|