当前位置:编程学习 > C#/ASP.NET >>

借人气,问下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中的方法。
直接调用就可以了。 --------------------编程问答--------------------
引用 11 楼 purexiafeng 的回复:
下毛的班。来人解决下撒,不解决都不准下班

呵呵..... --------------------编程问答--------------------
引用 15 楼 gtiroy 的回复:
[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[]);//根据参数直线方法,返回值就是原方法的返回值
自动返回返回值



--------------------编程问答--------------------
引用 20 楼 majunfanxuejia 的回复:
希望对你有帮助

利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载

加载dll后,需要使用dll中某类.
Type type=ass.GetType("namespace.ClassName");//利用类型的命名空间和名称获得类型

需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
//params[] 为 new…

我就想传个byte数组给 COM控件里。。。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,