C#调用VC dll输出参数

开发 后端
本文解决了c#的调用VC dll输出参数的问题。

最近做项目需要把以前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中的函数的声明及使用方法:

  1. using System.Runtime.InteropServices;//使用dll动态库和API函数必需  
  2.  
  3.  
  4.  
  5. [DllImport("PmacNc.dll", CharSet = CharSet.Ansi)]  
  6. public static extern int GetResponse(StringBuilder com_response, System.UInt32  
  7. maxchar, System.Char[] sendChar);  
  8.  
  9. 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**类型的输出参数也就是指针的指针,或者二维数组或其他更复杂的情况。可以参考以下网页:

http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html?opt=admin

http://www.ixpub.net/viewthread.php?tid=810850

【编辑推荐】

  1. C#程序中的数据显 示:自定义标签和XML、XSL
  2. C#自定义事件是如何生成的
  3. C# 自定义控件dll文件的生成步骤
  4. C#自定义快捷键的实现
  5. C#自定义事件的步骤介绍
责任编辑:book05 来源: csdn
相关推荐

2009-08-05 16:49:42

C#中调用dll

2009-08-05 09:09:14

C#调用VC DLL接

2009-08-05 09:22:43

C#调用VC DLL

2009-08-07 17:22:36

C#调用dll导出函数

2009-07-31 17:28:35

C#语言调用DLL

2009-08-03 12:57:27

C#调用DLL

2009-08-05 09:40:02

C#调用DLL函数

2009-08-05 09:30:39

C#调用DLL函数

2009-09-02 17:16:01

冒泡排序

2011-04-08 09:52:44

C++C#DLL

2009-08-05 17:06:39

ASP调用C# DLL

2024-03-01 20:59:11

C#DLL开发

2009-07-31 14:54:48

dll函数C#导出

2011-03-31 09:13:00

Visual Stud

2009-08-05 14:45:56

VC中DLL的创建及调

2009-08-17 13:26:20

C#调用Windows

2009-08-07 17:12:07

C# DLL函数

2009-08-18 16:31:19

Visual C#编写

2009-08-17 16:18:47

C#调用CreateO

2009-08-05 15:04:14

C# dll注入
点赞
收藏

51CTO技术栈公众号