有个网友在群中说:“问一个问题,vc写的dll返回值为char *,c#中如何定义,我定义了string,要出错的。”
有个网友建议他用unsafe,而后来他说他解决了,他的代码如下:

  [ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi ) ]
   public struct  KeyBuf
  {
            [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=256 )] 
            public string c;
  } 

他说这样就可以解决了,但后来,他又问,为什么非要用结构?
我也不清楚,希望有朋友可以指出一下。

后来,我试了一下:

  [MarshalAs(UnmanagedType.LPArray)] 
  public byte[] c;

但有一些问题,后来,用了:

[MarshalAs(UnmanagedType.LPArray)] 
public byte[] c=new byte[256];

为byte弄了一个缓冲区,成功了。

但又遇到一个问题,用Conver不能直接转换数符为string,所以改用了System.Text.Encoding才解决了问题。

经查MSDN资料发现UnmanagedType 枚举描述:
ByValTStr
用于在结构中出现的内联定长字符数组。与 ByValTStr 一起使用的字符类型由应用于包含结构的 System.Runtime.InteropServices.StructLayoutAttribute的 System.Runtime.InteropServices.CharSet参数确定。应始终使用 MarshalAsAttribute.SizeConst字段来指示数组的大小。 .NET Framework 的 ByValTStr 类型的行为类似于结构中的 C 样式、固定大小的字符串(例如,char s[5])。托管代码中的行为与 Microsoft Visual Basic 6.0 中的行为不同,后者不是空终止(例如,MyString As String * 5)。

LPArray

指向 C 样式数组的第一个元素的指针。当从托管到非托管进行封送处理时,该数组的长度由托管数组的长度确定。当从非托管到托管进行封送处理时,将根据 MarshalAsAttribute.SizeConst和 MarshalAsAttribute.SizeParamIndex字段确定该数组的长度,当需要区分字符串类型时,还可以后跟数组中元素的非托管类型。

也就是说ByValStr仅适合用于定长的字符串,而LPArray才用于不定长的字串。
看见国外有用StringBulider的解决方案,是String到Char *的映射的,还没试过行不行,具体可以看这里。

转载于:https://www.cnblogs.com/William_Fire/archive/2004/07/31/28950.html

刚才遇到了关于C#使用外部DLL函数上的char*的问题。相关推荐

  1. Python:使用ctypes库调用外部DLL 数据类型对应

    Python:使用ctypes库调用外部DLL(转) 前言

  2. VS 配置外部DLL的引用路径【可执行文件的环境路径】

    VS 配置外部DLL的引用路径[可执行文件的环境路径] 右键项目,属性->配置属性->调试->环境,在这里写入可执行文件运行时的环境路径,格式为:PATH=ABC,如PATH=$(S ...

  3. c#调用外部dll详解

     一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素之一, ...

  4. Unity调试外部DLL

    1.更改DLL的.csproj工程配置文件,在里面添加如下属性: <PropertyGroup Condition=" '$(OS)' == 'Unix' ">     ...

  5. Python:使用ctypes库调用外部DLL

    Python:使用ctypes库调用外部DLL 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆 ...

  6. 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL

    在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...

  7. 在 C++Builder 工程里调用 DLL 函数

    调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...

  8. 使用C#调用非托管DLL函数

    由于工作需要,学习了GDI+编程的一些知识.其中看到了一个比较好的Demo,深入的了解后,却发现自己对如何用C#调用非托管DLL函数也有了更好的理解,于是整理了一下,跟大家一起分享. 引用: 用C#来 ...

  9. 添加程序以DLL函数

    编写DLL: LIBRARY EXEdiy EXPORTS LoadDLL @1 #include "stdafx.h" #include <windows.h>voi ...

最新文章

  1. 提高开发效率之VS Code基础配置篇
  2. 负样本的艺术,再读Facebook双塔向量召回算法
  3. ElasticSearch集群部署【windows+Linux双系统搭建】
  4. Codeforces 1480A. Yet Another String Game (阅读理解题)
  5. mysql router docker_Docker 安装 Mysql 详解
  6. SAP CRM text Transfer mode
  7. 测试回收站测试回收站测试回收站测试回收站测试回收站测试回收站测试回收站测试回收站
  8. wampserver的mysql启动与环境变量设置
  9. oracle数据库主键自增序列_Oracle数据库序列详解
  10. PWA(Progressive Web App)入门系列:Sync 后台同步
  11. mysql goldengate_goldengate同步mysql
  12. laydate日期插件使用
  13. 浅谈Nginx性能调优
  14. 【ElasticSearch】Es 源码之 UsageService 源码解读
  15. Android Studio 如何修改项目名称
  16. php命令执行脚本文件,PHP文件包含与命令执行方式总结
  17. php后端接收数据,后端如何接收fetch方式发送的数据?
  18. Idea配置sbt(window环境)
  19. python里如何打开文件_python如何打开一个txt文件
  20. (2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案

热门文章

  1. python中的散点图代码-python – 带有图例的matplotlib散点图
  2. python的工作方向-python最赚钱的4个方向,你最心动的是哪个?
  3. 学python好找工作么-学完Python好找工作吗?为什么有人学完还找不到工作?
  4. python写程序求1-3+5-7+...-99+101的值-16-Python3-高价函数-提升效率必备
  5. python和c学习-学习 Python与C相互调用
  6. 汇编和python-python和汇编语言的区别知识点
  7. python语法怎么读-python怎么读sql数据?
  8. python空类型-在Python中__________表示空类型。
  9. python就业方向有哪些-Python的就业方向有哪些?薪资都是多少?
  10. python与c语言在语法上的区别-论c++/java/c 与python的语法上的区别