最近做项目需要把以前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. [DllImport("PmacNc.dll", CharSet = CharSet.Ansi)]
  3. public static extern int GetResponse(StringBuilder com_response, System.UInt32
  4. maxchar, System.Char[] sendChar);
  5. 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

http://www.csharpwin.com/csharpspace/7554r5824.shtml

(转自http://blog.sina.com.cn/s/blog_4c6e822d01017xk9.html

C#调用VC dll输出参数的更多相关文章

  1. 用exec调用带有output输出参数的存储过程

    用exec调用带有output输出参数的存储过程,想要得到输出参数的值,必须在调用参数后面加output关键字,如: declare @value int exec up_test    2,3,@v ...

  2. C#调用VC DLL堆栈不对称

    今天在调程序时,C#调用VC 编译的dll出现堆栈不对称,查了一下资料,转载在这里供大家参考. 问题描述:对 PInvoke 函数“xxFunction()”的调用导致堆栈不对称.原因可能是托管的 P ...

  3. 【Mysql 调用存储过程,输出参数的坑】

    玛德,数据行都返回过来了,就是没有输出参数!!! 扒官方设计文档:这么一段 雷死人了!!! When a stored procedure is called using MySqlCommand.E ...

  4. C#调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

  5. [转] ADO.NET调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(), @studentname nvarchar() OUTPUT AS BEGIN S ...

  6. VB调用VC dll的返回方式

    第一种类型:数值传递 注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,int类型的变量是32位的,在VB中要用long型变量来配合.VC++部分: e ...

  7. 关于C#动态调用VC Dll的方法(转)

    http://blog.csdn.net/null1/article/details/3953155

  8. QT调用VC DLL的例子(所有源码)

    http://blog.csdn.net/zhuce0001/article/details/20651025 http://blog.csdn.net/zhuce0001/article/detai ...

  9. 2015.5.9 C#编写DLL及C#调用C#DLL

    过程比C#调用VC++dll简单. 一.创建DLL 新建工程,类型选择类库,生成的结果就是dll 注意:在项目属性-应用程序中,注意三个地方,程序集名称和默认命名空间可以调整,但要一致,别的程序调用此 ...

随机推荐

  1. ZeroMQ/jzmq安装使用

    环境: No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.2 LTS Release: 12 ...

  2. DataTable数据进行排序、检索、合并、分页、统计

    在做程序时经常遇到要将反复对数据进行筛选.求和.排序.分页等的情况.每次的数据操作都要去访问数据库很明显是不合理的!当然需要实时数据的情况除外,不做讨论哈.今天无意间在网上看到了这篇文章,挺实用的,拿 ...

  3. 深入理解Oracle的imp/exp 和各版本之间的规则

    Oracle数据中IMP/EXP工具可用于对数据进行迁移.IMP命令用于把Dmp文件从本地导入到远程数据库服务器,而EXP命令则是把数据从远程数据库服务器导出到本地的Dmp文件.其功能相当于Oracl ...

  4. App新版本提醒

    童鞋们是否遇过在使用app的时候出现有新版本更新跳转到苹果商店的提示呢? github中有一个三方框架 Harpy 完美实现了这一功能! demo时刻 我的github - Harpy

  5. 简单3d RPG游戏 之 001 生命条(一)

    1.创建一个新项目,引用如下的包: 2.将asset里的First Person Controller拖入project作为游戏角色,将其命名为Player,将mainCamera删除,这样就是用Pl ...

  6. Asynchronous socket communication

    来源:http://www.codeproject.com/Articles/1608/Asynchronous-socket-communication 本地下载 Download source f ...

  7. Codeforces Round #209 (Div. 2)

    A: 要么是两次要么4次,判断是否在边界: #include<cstdio> using namespace std; int main() { int n,m,x; ; scanf(&q ...

  8. HDU4515+计算日期

    模拟! /* 计算过了D天后的日期 之前D天的日期 */ #include<stdio.h> int judge_year( int year ){ ==&&year%!= ...

  9. table 表头固定

    <html> <head> <title>Test</title> <style type="text/css"> .d ...

  10. Java集合类之HashMap

    package com.test; import java.util.*; public class Demo7_3 { public static void main(String[] args) ...