借人气,问下C#调用COM中传BYTE数组的
我用VC写了个COM组件写了个方法如下在 CTEST3Ctrl.h里声明:
LONG AddIn(BYTE* pFrame, LONG* plSize);
在CTEST3Ctrl.cpp实现
LONG CCTEST3Ctrl::AddIn(BYTE* pFrame, LONG* plSize)
{
。。。
}
在IDL声明
[id(1), helpstring("方法AddIn")] LONG AddIn(SAFEARRAY(byte)pFrame, LONG* plSize);
在CTEST3Ctrl.cpp映射的类型
BEGIN_DISPATCH_MAP(CCTEST3Ctrl, COleControl)
DISP_FUNCTION_ID(CCTEST3Ctrl, "AddIn", dispidAddIn, AddIn, VT_I4, VTS_PUI1 VTS_PI4)
END_DISPATCH_MAP()
但是我在C#里调用时总是报类型不匹配
try
{
int size = 200;
byte[] d = new byte[200];
axCTEST31.AddIn(d, ref size);
}
catch (COMException c)
{
MessageBox.Show(c.Message.ToString());
}
请问各位大侠,我代码哪里有问题?我是照着MSDN上的那个例子写的
MSDN例子:
为提高交互操作,可以在非托管方法签名中将参数作为 SAFEARRAY 键入。例如:
复制代码
HRESULT DoSomething(SAFEARRAY(byte)buf);
--------------------编程问答-------------------- sf 帮顶 。 --------------------编程问答-------------------- -_- --------------------编程问答-------------------- 你做成dll吧
using System.Runtime.InteropServices;
然后
[DllImport()] --------------------编程问答-------------------- ding --------------------编程问答-------------------- -_-领导有规定 --------------------编程问答-------------------- 实在不懂.帮你顶到前边去..希望高手解答 --------------------编程问答-------------------- 有高人能回答下吗 --------------------编程问答-------------------- 下班!mark! --------------------编程问答-------------------- 要下班啦,哈哈
顶顶 --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 下毛的班。来人解决下撒,不解决都不准下班 --------------------编程问答-------------------- Mark --------------------编程问答-------------------- int size改成Int32试试 --------------------编程问答-------------------- 数据流 --------------------编程问答-------------------- [DllImport(xxx.dll)]
dll中的方法。
直接调用就可以了。 --------------------编程问答--------------------
呵呵..... --------------------编程问答--------------------
UP --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 顶一个 --------------------编程问答-------------------- 希望对你有帮助
利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载
加载dll后,需要使用dll中某类.
Type type=ass.GetType("namespace.ClassName");//利用类型的命名空间和名称获得类型
需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
//params[] 为 new object[]{}参数
调用类型中的某个方法:
需要首先得到此方法
MethodInfo mi=type.GetMethod("MehtodName");//通过方法名称获得方法
然后对方法进行调用,多态性利用参数进行控制
mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值
自动返回返回值
--------------------编程问答--------------------
我就想传个byte数组给 COM控件里。。。
补充:.NET技术 , C#