c#没法正确调用mfc dll提供的接口

baidu_28726667 2019-04-17 03:00:24
对方提供的接口原来在c++使用是 XXdocument * (CreateCustomFile(对应的文档枚举类型)); 内部会返回一个对象的指针. 然后通过XXdocument ->funX()来操作相关的功能。问题这个对象的类型是XXdocument 我在c#里面定义委托没法找到这个类型。

首先我在命名空间外定义了cpp里面一样的枚举
public enum XXdocument { PDF, EXCEL}; //没报错

然后命名空间的类里面

[DllImport("xxxx.dll", EntryPoint ="CreateCustomFile",CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] //没报错

如果用
static extern void CreateCustomFile(枚举类型 FileType); //没报错

但是用
static extern XXdocument *CreateCustomFile(类型 FileType); //报错,找不到XXdocument 类型

delegate 更加也是找不到 XXdocument 这个类型。 应该怎么正确使用这个dll呢?


...全文
593 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2019-04-19
  • 打赏
  • 举报
回复
还有,让他封装成com dll,以期望.net能自动生成一个可以帮助你调用的dll(添加引用) 你可以加个系统中已有的com组件,熟悉熟悉
蒋晟 2019-04-19
  • 打赏
  • 举报
回复
不要指望能在C#里访问XXdocument类的成员或者调用其成员函数。 如果你的DLL是MFC扩展DLL,洗洗睡吧,只有同一个版本的MFC的程序能用你的DLL,因为MFC的扩展DLL只兼容同一个版本的MFC程序。 如果你的DLL是MFC标准DLL,那你的DLL大概写得不标准,因为你用了自定义的类,这会大概率导致兼容性问题,因为C++没有二进制兼容接口。可以把DLL改成标准的,所有参数和返回值都是C里面的基本数据类型和基本数据类型的结构(至于具体怎么写,去看OpenFileName之类的Windows API)。如果你没有DLL的源代码,可以写个C++/CLI的封装DLL,在这个DLL里写一个托管类把所有到XXdocument类的访问都封装一遍,然后再在C#里引用这个C++/CLI的DLL。 比如 public ref class XXdocumentWrapper { public: static XXdocumentWrapper^ CreateCustomFile(XXdocumentEnumWrapper fileType); XXdocument* nativePointer; } 因为你的DLL不标准,这个C++/CLI的DLL需要和你的原DLL使用同样的Visual C++版本和编译配置才能用。不要图侥幸搞出很难调试的兼容性问题,同一套代码在Debug和Release版,以及MBCS/Unicode版下都可能会有内存布局差异。
baidu_28726667 2019-04-18
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
用vc++/cli,它同时兼容.net和mfc


目前使用vs2015 创建了 CLR 控制台,可以调用。。。
xian_wwq 2019-04-18
  • 打赏
  • 举报
回复
1.返回的XXdocument *, 其实是对象的地址,
在c#中直接定义枚举来对应肯定不行

2. P/Invoke调用不是无条件的
如果非要用MFC的东西,还得再封装一层,
使用extern "C",让对外暴露的接口以纯c的方式提供
可以参考WinApi的定义。

3.楼上说的c++/cli包装也是种方案


OrdinaryCoder 2019-04-18
  • 打赏
  • 举报
回复
用C++/CLI再包装一层
threenewbee 2019-04-17
  • 打赏
  • 举报
回复
用vc++/cli,它同时兼容.net和mfc
stherix 2019-04-17
  • 打赏
  • 举报
回复
引用 4 楼 baidu_28726667 的回复:
[quote=引用 1 楼 stherix 的回复:] 这种接口只有c++能调用 而且还必须是同一种或者相似的编译器 如果你想c#能调用,估计要用c++/cli来写个Adapter 难度视你的c++水平和对方类库的大小而定
意思这个函数指针,类型只能是公共的 int ,bool之类? 自定义的 class类型不可以? 因为这个类本身跟mfc没关。只是dll里面实现使用了mfc相关的东西[/quote] 只要是参数/返回值涉及到了 c++的类,其他语言就基本无能为力了,或者实现起来非常麻烦,就像lua绑定那样 除非是不含函数的纯struct
baidu_28726667 2019-04-17
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
这种接口只有c++能调用 而且还必须是同一种或者相似的编译器 如果你想c#能调用,估计要用c++/cli来写个Adapter 难度视你的c++水平和对方类库的大小而定
意思这个函数指针,类型只能是公共的 int ,bool之类? 自定义的 class类型不可以? 因为这个类本身跟mfc没关。只是dll里面实现使用了mfc相关的东西
baidu_28726667 2019-04-17
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
额,别用MFC提供请用标准C/C++,哪怕他用MFC开发,但对外提供也请给标准的C++定义 比如一个他要用mfc的Cstring给你,这会死人的。
这个dll里面用了mfc的东西,但是暴露出来的 XXdocument类型本身跟mfc没关啊。。。
wanghui0380 2019-04-17
  • 打赏
  • 举报
回复
额,别用MFC提供请用标准C/C++,哪怕他用MFC开发,但对外提供也请给标准的C++定义 比如一个他要用mfc的Cstring给你,这会死人的。
stherix 2019-04-17
  • 打赏
  • 举报
回复
这种接口只有c++能调用 而且还必须是同一种或者相似的编译器 如果你想c#能调用,估计要用c++/cli来写个Adapter 难度视你的c++水平和对方类库的大小而定

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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