互操作性----C# 调用 C++生成的DLL

简介:

C++创建的是Win32 DLL程序,代码如下:

#include "stdafx.h"
#include "CustomerInfo.h"
#include <stdio.h>
#include <malloc.h>
 
typedef struct {
     char  name[32];
     int  age;
}Customer;
 
 
CustomerInfo* customerInfo;
 
extern  "C"  __declspec(dllexport) Customer* Create( char * name, int  age)
{
     Customer* cust = (Customer*)malloc( sizeof (Customer));
 
     customerInfo = new  CustomerInfo(name, age);
     strcpy(cust->name,customerInfo->GetName());
     cust->age = customerInfo->GetAge();
 
     return  cust;
}
 
void  __stdcall PrintMsg( const  char * msg)
{
     printf( "%s\n" ,msg);
     return ;
}
 
extern  "C"  __declspec(dllexport) int  Add( int  x, int  y)
{
     return  x + y;
}
 
extern  "C"  __declspec(dllexport) int  Sub( int  x, int  y)
{
     return  x - y;
}

 

C++创建的头文件CustomerInfo.h代码如下:

class  CustomerInfo{
private :
     char * m_Name;
     int  m_Age;
 
public :
     CustomerInfo( char * name, int  age)
     {
         m_Name = name;
         m_Age = age;
     }
 
     virtual  ~CustomerInfo(){}
     int  GetAge(){ return  m_Age;}
     char * GetName() { return  m_Name;}
};

 

C#创建控制台应用程序,代码如下:

class  Program
  {
      [DllImport( "NativeLibTest.dll" )]
      public  static  extern  int  Add( int  x, int  y);
 
      [DllImport( "NativeLibTest.dll" )]
      public  static  extern  int  Sub( int  x, int  y);
 
      [DllImport( "NativeLibTest.dll" )]
      public  static  extern  IntPtr Create( string  name, int  age);
 
 
      [StructLayout(LayoutKind.Sequential)]
      public  struct  Customer
      {
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
          public  string  Name;
 
          public  int  Age;
      }
 
 
      static  void  Main( string [] args)
      {
         int  temp = Add(4, 7);
         Console.WriteLine( temp.ToString());
 
         IntPtr ptr = Create( "work hard work smart" , 27);
         Customer customer = (Customer)Marshal.PtrToStructure(ptr, typeof (Customer));
         Console.WriteLine( "Name:{0}, Age:{1}" , customer.Name, customer.Age);
      }
  }

注意:C++生成的DLL和Lib文件拷到C#的Bin目录下,或者输出文件路径指向为生成的DLL文件路径。

 

 

本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2011/09/24/2189396.html,如需转载请自行联系原作者


目录
相关文章
|
7月前
|
C#
C# 解决引用dll,出现dll不可以使用等问题
C# 解决引用dll,出现dll不可以使用等问题
|
7月前
|
C++ 数据格式
LabVIEW传递接收C/C++DLL指针
LabVIEW传递接收C/C++DLL指针
196 1
|
3月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
4月前
|
存储 C++
C++ dll 传 string 类 问题
C++ dll 传 string 类 问题
32 0
|
4月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
91 0
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
6月前
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
129 3
|
6月前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
99 0
|
6月前
|
程序员 C# C++
lpszBlogName C#开发多年中途被迫改行C++但工作中又经常偷偷使用C#的C++程序员
通过AUMID解析出packageFamily,再根据PackageManager解析出安装目录 PackageManager是WinRT的类型,如何在c++中使用WinRT,请参考C++/WinRT 以下代码需要管理员权限才能运行。