作者proach (pazroach)
看板C_Sharp
标题Re: [问题] C#呼叫C++ DLL, 再呼叫另一个 C++ DLL ?
时间Thu Apr 28 00:21:48 2011
在参考 horngsh 兄台的资料,以及一些网路上的资料後,以下是我的结论。
※ 引述《proach (pazroach)》之铭言:
: 我要操作购入仪器,需透过他提供的 DLL以控制 usb周边。他的原始码是 VC++ 6.0
: 开发的,我拿到的东西有
: DriverLib.h DriverLib.lib DriverLib.dll 三个档案。
: 以前我用 VC++.Net 混用 managed与 unmanaged code可以写程式控制,现在
: 想把程式都移植到 VC#上。原先是想在 C#内用 DllImport的方式呼叫 dll,
这样做可行的。先用 VC++做一个简单的 DLL,基本上就是被呼叫到之後
换个方式去呼叫厂商给的 VC6.0 DLL。
: 问题一:
: VC#需要将上述两个档案加入专案内吗?是的话是加入 reference内?
不用加入。
但是好在我 google到一个人的抱怨,一样的程式码,他用 .Net Framework 4.0
会失败,改用 3.0 就成功。
: 问题二:
: 以前在 VC++内写的程式码要呼叫以下 function
: short openDevice( &Handle );
: 我之前写的程式码是这样的
: HANDLE handle;
: short shortOpenSuccess = openDevice( &handle );
: 但是在 VC#内找不到 HANDLE 这个关键字,我要怎麽呼叫呢?
: 我最後有个奇怪的想法不知是否可行。因为此周边其实都是传回一些byte array而已,
: 如果用 VC++ 写个简单的 Wrapper.dll,以处理 "HANDLE" 这东西的问题。
: VC# 去呼叫 Wrapper.dll,Wrapper.dll 再去呼叫 DriverLib.dll,只要
: 回传一堆 byte就好,HANDLE 留在 Wrapper.dll 内不用回传,这样可行吗?
证实可行。 VC++ DLL自己用变数记住此 Handle即可。VC# callee从来没碰过
任何 IntPtr, nor Handle也可执行。
: 这样会不会每次 VC#呼叫 Wrapper.dll时,都要重新配置一次记忆体?
: 还是只要呼叫过第一次,就留在记忆体内了?
: 多谢您的回答 :)
厂商给的 DLL是用来控制硬体用的东西,因此传送资料都是用
Byte* ABlockOfMemroy; 的方式来传递。我在 VC#内有几个对应的动作。
DllImport的使用稍微加一点东西,像是
[DllImport("CPP.dll", EntryPoint = "ReadIO", CharSet =
CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
private static extern void ReadIO( byte [] DataBuffer);
我不能确定这些attribute的真正用途,但不加上的话很可能会出错。
有趣的是,这个 ReadIO( )是去呼叫厂商给的
void XReadIO( Byte* buffer ); XReadIO会把此指标指向的记忆体填满。
我查到的资料都要说在 C#这边要用 String 或是 StringBuilder,
结果我最後还是使用 byte [ ] 才成功。
以上是C#新手经验回报,有错请不吝指证 :)
用 C++做数值处理,操作底层位元组,搭配用 VC# WinForm做 GUI实在是
很开心的事情。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.194.138
1F:推 psliurt:会使用String应该是function内部不会变动到该String内容才 05/13 23:53
2F:→ psliurt:会使用,这种方式比较像是C++的const char*的样子 05/13 23:54
3F:→ psliurt:而会用到StringBuffer,应该是该function内修改到字串内容 05/13 23:56