首页 新闻 赞助 找找看

c#调用c++dll

0
悬赏园豆:80 [待解决问题]

c++原函数:Rect* Image2Result(Mat &frame,int **label,double **confidence)
c#中主要用到委托:

委托声明:        public delegate IntPtr Recdel(ref Mat frame ,ref int[] label,ref int[] confidence);

        
        [DllImport(@"F:\MFC_study\lbp调用\lbp调用\bin\Debug\lbp_faces.dll",EntryPoint= "Image2Result")] 
        static extern IntPtr Image2Result (ref Mat frame,ref int[] label,ref int [] confidence);

调用时:            Recdel test = Image2Result;
            intp = test(ref frame, ref label, ref confidence);
其中Mat为emgucv自带的类

遇到的问题:
此类型的层次结构中有 ComVisible(false)父级,因此不允许 QueryInterface 调用 IDispatch 或类接口。

有谁知道这个怎么解决吗?

问题补充:

用到了Emgucv

455271574的主页 455271574 | 初学一级 | 园豆:122
提问于:2016-03-28 21:16
< >
分享
所有回答(1)
0

 

在你的非托管代码(lbp_faces.dll)中,你需要 Mat 能够响应 QueryInterface 调用,但是因为 Mat 的 ComVisible 被设置为了 false,从而导致调用失败。—— 我把你的问题总结的正确吗?

 

如果是,至少有两种解决方案:

1、新建 MyMat 从 Mat 继承,则 Mat 上所有没有被标记为 ComVisible(false) 的成员对 COM 是可见的;

2、问问你自己为什么需要在 lbp_faces.dll 中调用 Mat 成员?是否可以将这部分功能继续留在托管代码中实现,在你的 lbp_faces.dll 中只是做一些计算?

Launcher | 园豆:45045 (高人七级) | 2016-03-29 09:30

总结得很正确~那正是我的问题所在,新建MyMat从Mat类继承后,调用的时候参数不也还是Mat类型吗?我试了试,但还是有问题~
还是我理解有偏差?  不过还是感谢你给我提供了一个思路
Mat类还是要要传输的哈,第三种方法估计不可行~  能加一下QQ吗,455271574,这一块确实困扰我好多天了,真的是太麻烦你了

支持(0) 反对(0) 455271574 | 园豆:122 (初学一级) | 2016-03-29 18:40

@455271574: 调用时传递 MyMat 对象。

https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.comvisibleattribute(v=vs.110).aspx

除非将类及其成员显式设置为 false,否则,继承类将向 COM 公开原始类中不可见的基类成员。例如,如果将 ClassA 设置为 false,而且不对其成员应用该特性,则该类及其成员对 COM 是不可见的。但是,如果从 ClassA 派生 ClassB,并将 ClassB 导出到 COM,则 ClassA 的成员将成为 ClassB 的可见基类成员。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2016-03-30 09:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册