c#调用C++的DLL文件
C#调用一个C++得函数,其中参数是一个结构体得指针,请问在c#中如何调用C++函数
BOOL GetUserData(CMsgDataDump::TZHJDLLYHSJ* ptUserData,UINT uiIndex=0);
Return Value
是否有用户数据。
Parameters
ptUserData指向保存用户数据地址的指针。
uiIndex 取第几个用户的数据。
c++结构体
typedef struct _TZHJDLLYHSJ
{
DWORD m_dwSelfID; //本机地址
DWORD m_dwBroadcastID; //通播地址
UINT m_uFreq; //本机入站频度
UINT m_uSelfType; //本机类别
UINT m_uSelfLevel; //本机通信等级
UINT m_uCttBitLen; //通信最大Bit数
BOOL m_bEncrypted; //本机是否为加密用户
UINT m_uLastEnterBeam; //上次入站波束
UINT m_uUserNum; //所辖用户数目
DWORD m_dwUserID[MSG_MAX_USER_NUM]; //所辖用户地址
DWORD m_dwDeviceID; //出厂编号
BOOL m_bVerify; //校验和是否正确
UINT m_uiIndex; //预留
}TZHJDLLYHSJ;
我写的C#的方法
_TZHJDLLYHSJ TZHJDLLYHSJ = new _TZHJDLLYHSJ();
GetUserData(ref TZHJDLLYHSJ, 0);
string id=TZHJDLLYHSJ.m_dwSelfID;
为什么出来的值不对呢?
--------------------编程问答-------------------- http://topic.csdn.net/u/20091113/16/c65048a2-608a-4889-9f0c-fb2d69462cab.html
http://topic.csdn.net/u/20091208/19/490341bb-b8eb-428a-b1c7-21206dbb4323.html --------------------编程问答-------------------- --------------------编程问答-------------------- 这个问题很难 --------------------编程问答-------------------- TZHJDLLYHSJ 用C#定义就可以了 --------------------编程问答-------------------- up
mark --------------------编程问答-------------------- 托管代码如何调用非托管代码(c sharp如何调用c++代码)?
托管代码如何调用非托管代码(c sharp如何调用c++代码)?
两种常用的做法:
下载:
http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2007_01.exe
1. COM interop
具体操作:
a. 用atl写com服务程序
b. 使用Tlbimp将atl写的com程序转换成 COM DLL
用如下命令:
tlbimp 你写的com.dll
tlbimp是 .NET Framework SDK中附带的类型库导入程序。用这个命令即是把生成一个非托管com dll的托管包装。
c. 托管客户端非常简单
直接new一下,然后调用对应的方法即可。
2. P/Invoke
a. 在托管客户端增加一条 DllImport语句和一个方法的调用。
介绍一个P/Invoke网站,http://pinvoke.net/
这个网站主要是一个wiki,允许开发者发现,编辑,增加PInvoke的签名,用户自定义类型和从托管代码(指c#和VB.net开发语言)访问 win32和其他非托管api的信息。
世界各地的.Net开发者可以很容易分享自己有价值的东西给社区,
摘自http://www.cppblog.com/alantop/archive/2008/04/16/47318.html --------------------编程问答-------------------- 如何在C#中加载自己编写的动态链接库(DLL)
http://www.kehui.net/index.php/article/read/30/26323
C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
http://www.haoyu63.com/article.asp?id=129
C#调用非托管DLL的APIs
http://www.cnblogs.com/xdotnet/archive/2007/08/10/csharp_cpp_dll_pinvoke.html
心得:
1. int类型没有问题,其他object类型,比如string,有不少调用问题。比如返回值只能是int或者void
2. 注意encode的问题,char,wchar_t。建议使用wchar_t,要不中文有问题。因为在c#中默认都是unicode
3. 字符串函数使用方法:
c++dll中:
extern "C" __declspec(dllexport) void __stdcall Test(wchar_t * strInput, wchar_t * strOutput)
c#使用:
[DllImport("XXX.dll", EntryPoint = "Test", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern string Test(string strInput, StringBuilder strOutput);
其中,strInput是输入值,strOutput是返回值。
建议将c++dll拷贝到windows目录,方便调用。
StringBuilder要预先分配好足够的内存,要不会报错。所以在c++函数中要控制输出字符串长度。
希望对您有用!
http://blog.csdn.net/AndrewWang79/archive/2009/02/02/3859250.aspx
--------------------编程问答-------------------- 可以这样做,你可再建一个可托管的c++项目,然后把你旧的项目的一些头文件api给开放出来,然后使用C#调用就很简单了 --------------------编程问答-------------------- 一楼的资料可供参考.
另外,本网站有这方面的资料下载,包括了C++中类型之间与C#之间的对应关系。
--------------------编程问答-------------------- --------------------编程问答--------------------
补充:.NET技术 , 其他语言