C#调用C++版本dll时的类型转换需要注意的问题小结

C#对于C++的dll引用时,经常会遇到类型转换和struct的转换

1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应

2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));说明:此方式转换只针对包含c++基本类型的结构体,如果包含指针数组的结构体,使用泛型函数比较方便。

3. [StructLayoutAttribute(LayoutKind.Sequential)] 说明:StructLayoutAttribute 类 使 用户可以控制类或结构的数据字段的物理布局;LayoutKind控制当导出到非托管代码时对象的布局。

4. [MarshalAsAttribute(UnmanagedType.LPWStr)] 指示如何在托管代码和非托管代码之间封送数据;说明:UnmanagedType指定如何将参数或字段封送到非托管代码。

托管代码 (managed code)

  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

  托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware compiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。

非托管代码 (unmanaged code)
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

(0)

相关推荐

  • C#中子类调用父类的实现方法

    本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用.具体方法如下: 一.通过子类无参构造函数创建子类实例 创建父类Person和子类Student. public class Person { public Person() { Console.WriteLine("我是人"); } } public class Student : Person { public Student() { Console.WriteLine("我是学生"); } }

  • C#调用mmpeg进行各种视频转换的类实例

    本文实例讲述了C#调用mmpeg进行各种视频转换的类.分享给大家供大家参考.具体如下: 这个C#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行视频转换 using System.Web; using System.Configuration; namespace DotNet.Utilities { //if (this.fload.HasFile) //{ // string upFileName = HttpContext.Current.Server.MapPa

  • C#中调用VB中Inputbox类的实现方法

    C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用 一:间接调用vb中的Inputbox功能 1.在项目中添加对Microsoft.VisualBasic引用       2.在项目中添加命名空间Using Microsoft.VisualBasic;       3.以后就可以直接使用VB中的好多类库(爽啊--) 例如:textBox1.Text=Microsoft.VisualBasic.Interaction.InputBox("提示性文字"

  • C#中派生类调用基类构造函数用法分析

    本文实例讲述了C#中派生类调用基类构造函数用法.分享给大家供大家参考.具体分析如下: 这里的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数 例如: public class MyBaseClass { } public class MyDerivedClass : MyBaseClass { public MyDerivedClass() { Console.WriteLine("我是子类无参构造函数&qu

  • C#使用Process类调用外部程序分解

    在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程. 一.启动进程实例 复制代码 代码如下: Process myProcess = new Process();   try  {       myProcess.StartInfo.UseShellExecute = false;       myProcess.StartInfo.FileName = "test.exe";    

  • SQL Server中调用C#类中的方法实例(使用.NET程序集)

    需求是这样的,我在.net程序里操作数据时将一些字段数据加密了,这些数据是很多系统共用的,其中一delphi程序也需要用到,并且需要将数据解密,由于我在.net里加密的方式比较特殊,在delphi程序里解密比较繁琐且要消耗很多时间,所以不得不让sqlserver调用程序集的方式来解决问题. 下面只是一个例子,贴出来共享. 建立一个dll,class,代码如下: 复制代码 代码如下: namespace MyDll {     public partial class MyClass     {

  • C#调用Java类的实现方法

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理:使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包:com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件: 二.到IKVM官方网站下载IKVM需要的组件  http://www.ikvm.net/ ikvm-0.42.0.3.zip ikvmbin-0.42.0.3.zip openjdk6-b16

  • C#使用Process类调用外部exe程序

    在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Process类在System.Diagnostics包中. 示例一 复制代码 代码如下: using System.Diagnostics; Process p = Process.Start("notepad.exe"); p.WaitForExit();//关键,等待外部程序退出后才能往下执行 通过上述代码可以调用记事本程序,注意如果不是调用系统程序,

  • HttpHelper类的调用方法详解

    本文实例为大家分享了HttpHelper类的方法使用,供大家参考,具体内容如下 首先列出HttpHelper类 /// <summary> /// Http操作类 /// </summary> public class HttpHelper { private static log4net.ILog mLog = log4net.LogManager.GetLogger("HttpHelper"); [DllImport("wininet.dll&qu

  • PHP调用C#开发的dll类库方法

    有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序集放入到全局缓存中. 1. 创建一个 C# Class Library ,命名为:HelloWorld 2. 打开项目的属性,在点选左边的 "Application"(就是第一个tab) , 然后点击Assembly Information 按钮 ,在弹出的Dialog中, 必须在底部勾上: Make assembly COM

随机推荐