C++做了一个dll,其函数的输入类型是一个Mat类型,返回的是Point类型,那么C#程序怎么调用这个dll

pixian0237 2017-04-08 04:43:25
如题,现在我用的是C#做前台界面,算法部分用的是C++做的,然后转变为dll提供给C#调用,现在dll的函数的输入类型是Mat,C#对应的输入什么类型呢
...全文
496 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-10
  • 打赏
  • 举报
回复
混和编程的Killer: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
pixian0237 2017-04-10
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 vnvlyp 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 vnvlyp 的回复:] 只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
扯![/quote] 不然string怎么知道数组有多长?[/quote] http://www.cplusplus.com/reference/string/string/length/index.html[/quote] 我放弃了,C#和c++这混合编程问题太多了,不用C#做opencv方面的程序了,直接用QT做吧。。谢了。。
赵4老师 2017-04-10
  • 打赏
  • 举报
回复
引用 7 楼 vnvlyp 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 vnvlyp 的回复:] 只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
扯![/quote] 不然string怎么知道数组有多长?[/quote] http://www.cplusplus.com/reference/string/string/length/index.html
pixian0237 2017-04-10
  • 打赏
  • 举报
回复
引用 5 楼 vnvlyp 的回复:
只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
dll函数的输入是const char*类型的数据,输入的是图片的地址,所以肯定是字符串的
vnvlyp 2017-04-09
  • 打赏
  • 举报
回复
只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
vnvlyp 2017-04-09
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 vnvlyp 的回复:] 只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
扯![/quote] 不然string怎么知道数组有多长?
赵4老师 2017-04-09
  • 打赏
  • 举报
回复
引用 5 楼 vnvlyp 的回复:
只有const char *在表示字符串的时候才能转换成string的,你如果只是一些字节,是不能用string的。
扯!
pixian0237 2017-04-08
  • 打赏
  • 举报
回复
引用 3 楼 vnvlyp 的回复:
[quote=引用 2 楼 pixian0237 的回复:] [quote=引用 1 楼 vnvlyp 的回复:] 我觉得你应该用指针而不是结构体或类。 这不是你要用什么类型的问题,而是首先C++和C#的类对象都不是一个东西你怎么能直接传递?
用指针啊。。那么如果我把dll传递的变量类型转换为const char*,那么C#相应传递的类型是string吗[/quote] const char *是对应的string,但是跟你这个有什么关系? 我的意思是你要在C#里也定义一个相同的结构,然后定义参数类型时用MarshalAs(UnmanagedType.LPStruct)表示传递指针。 你可以看一下这里https://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx的第三个例子Example 3 C结构
typedef struct tagLOGFONT 
{ 
   LONG lfHeight; 
   LONG lfWidth; 
   LONG lfEscapement; 
   LONG lfOrientation; 
   LONG lfWeight; 
   BYTE lfItalic; 
   BYTE lfUnderline; 
   BYTE lfStrikeOut; 
   BYTE lfCharSet; 
   BYTE lfOutPrecision; 
   BYTE lfClipPrecision; 
   BYTE lfQuality; 
   BYTE lfPitchAndFamily; 
   TCHAR lfFaceName[LF_FACESIZE]; 
} LOGFONT; 
C#类
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public class LOGFONT 
{ 
    public const int LF_FACESIZE = 32;
    public int lfHeight; 
    public int lfWidth; 
    public int lfEscapement; 
    public int lfOrientation; 
    public int lfWeight; 
    public byte lfItalic; 
    public byte lfUnderline; 
    public byte lfStrikeOut; 
    public byte lfCharSet; 
    public byte lfOutPrecision; 
    public byte lfClipPrecision; 
    public byte lfQuality; 
    public byte lfPitchAndFamily;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LF_FACESIZE)]
    public string lfFaceName; 
}
DLL函数声明
[DllImport("gdi32.dll", CharSet=CharSet.Auto)]
      public static extern IntPtr CreateFontIndirect(
            [In, MarshalAs(UnmanagedType.LPStruct)]
            LOGFONT lplf   // characteristics
            );
[/quote] 我还有有一个A_dll,和这个dll唯一不同的就是输入不是直接穿mat类型的图片,而是传递图片所在的地址,也就是const char*,那么我就是在C#应该就是传递string类型的数据到A_dll函数里,对吧??不过就是会出现 “System.Runtime.InteropServices.SEHException”类型的第一次机会异常在 WindowsFormsApplication3.exe 中发生 其他信息: 外部组件发生异常。 如有适用于此异常的处理程序,该程序便可安全地继续运行。 这种异常,不知道为什么
vnvlyp 2017-04-08
  • 打赏
  • 举报
回复
引用 2 楼 pixian0237 的回复:
[quote=引用 1 楼 vnvlyp 的回复:] 我觉得你应该用指针而不是结构体或类。 这不是你要用什么类型的问题,而是首先C++和C#的类对象都不是一个东西你怎么能直接传递?
用指针啊。。那么如果我把dll传递的变量类型转换为const char*,那么C#相应传递的类型是string吗[/quote] const char *是对应的string,但是跟你这个有什么关系? 我的意思是你要在C#里也定义一个相同的结构,然后定义参数类型时用MarshalAs(UnmanagedType.LPStruct)表示传递指针。 你可以看一下这里https://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx的第三个例子Example 3 C结构
typedef struct tagLOGFONT 
{ 
   LONG lfHeight; 
   LONG lfWidth; 
   LONG lfEscapement; 
   LONG lfOrientation; 
   LONG lfWeight; 
   BYTE lfItalic; 
   BYTE lfUnderline; 
   BYTE lfStrikeOut; 
   BYTE lfCharSet; 
   BYTE lfOutPrecision; 
   BYTE lfClipPrecision; 
   BYTE lfQuality; 
   BYTE lfPitchAndFamily; 
   TCHAR lfFaceName[LF_FACESIZE]; 
} LOGFONT; 
C#类
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public class LOGFONT 
{ 
    public const int LF_FACESIZE = 32;
    public int lfHeight; 
    public int lfWidth; 
    public int lfEscapement; 
    public int lfOrientation; 
    public int lfWeight; 
    public byte lfItalic; 
    public byte lfUnderline; 
    public byte lfStrikeOut; 
    public byte lfCharSet; 
    public byte lfOutPrecision; 
    public byte lfClipPrecision; 
    public byte lfQuality; 
    public byte lfPitchAndFamily;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LF_FACESIZE)]
    public string lfFaceName; 
}
DLL函数声明
[DllImport("gdi32.dll", CharSet=CharSet.Auto)]
      public static extern IntPtr CreateFontIndirect(
            [In, MarshalAs(UnmanagedType.LPStruct)]
            LOGFONT lplf   // characteristics
            );
pixian0237 2017-04-08
  • 打赏
  • 举报
回复
引用 1 楼 vnvlyp 的回复:
我觉得你应该用指针而不是结构体或类。 这不是你要用什么类型的问题,而是首先C++和C#的类对象都不是一个东西你怎么能直接传递?
用指针啊。。那么如果我把dll传递的变量类型转换为const char*,那么C#相应传递的类型是string吗
vnvlyp 2017-04-08
  • 打赏
  • 举报
回复
我觉得你应该用指针而不是结构体或类。 这不是你要用什么类型的问题,而是首先C++和C#的类对象都不是一个东西你怎么能直接传递?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧