• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#调用VCdll输出参数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  最近做项目需要把以前Vc写的程序整合到VS2005来,用c#写的,以前VC的动态连接库写好了,重写比较麻烦,让C#调用VC dll就好了。但碰到了一个问题:VC中作为输出参数的char*类型的变量应该怎样申明才能正确输出数据呢?

  一般说来,在VC中一般的输出参数都为指针或数组的形式,如果是一般类型的指针如整形等,在c#中用ref加上数据变量则可获得返回值。所以我试着把VC中char*输出变量在c#中写成ref string(因为char*在c#中可以写成string或char[]),但发现这样写是不行的。

  后来从网上查了些资料,发现char*类型数据作为输出参数时,在c#中数据类型要写成StringBuilder。这样既解决了传进去的参数问题,又解决了传出参数的问题。

  以下例子是我用C#调用VC dll中的函数的声明及使用方法:

  using System.Runtime.InteropServices;//使用dll动态库和API函数必需

  [DllImport("PmacNc.dll", CharSet = CharSet.Ansi)]

  public static extern int GetResponse(StringBuilder com_response, System.UInt32

  maxchar, System.Char[] sendChar);

  Global.UserDll.GetResponse(com_response, 100, sendchar1);

  C#调用VC dll输出参数的注意事项

  1.CharSet要使用Ansi,因为Vc默认是Ansi的,而c#是Unicode,两者不统一会产生乱码。还有其他DIIImport的其他参数如下,除了EntryPoint,其他三个都是非必要的。

  EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。

  CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE)

  CallingConvention指示入口点的函数调用约定(默认WINAPI)

  SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false )

  2.结构体的引用传递

  首先在c#中定义和c++相同的结构体,如果是引用传递,在结构体前面加上[In, Out],如:

  [DllImport(@"test.dll")]

  public static extern int test([In, Out] SLineData[] lndt,ref UInt32 length);

  3.如果遇到char**类型的输出参数也就是指针的指针,或者二维数组或其他更复杂的情况。可以参考以下网页托福答案
 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#语言总结1发布时间:2022-07-13
下一篇:
在C#中怎么样声明全局变量?发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap