日期:2014-05-18  浏览次数:21157 次

C#调用C++dll中的类
//C++dll 项目下实现 ClockTime类,编译生成ClockTimeDLL.dll
class __declspec(dllexport) ClockTime
{
private:
int hour;
int second;
int minute;
public:
ClockTime(void);
  ClockTime(int aa);
ClockTime(int _hour,int _second,int _mintue);
~ClockTime();
void setHour(int _hour);
int getHour();
};

//C# 控制台项目
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleUseCppDll
{
  class Program
  {
  static void Main(string[] args)
  {
  Console.WriteLine("Hello,zhangsan.");
  ClockTime tt;
  tt.setHour(12);
  int a=tt.getHour();
  Console.WriteLine(a);

  Console.Read();
  }

  [DllImport("ClockTimeDLL.dll", EntryPoint = "ClockTime", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  public extern class ClockTime;

  [DllImport("ClockTimeDLL.dll", EntryPoint = "ClockTime::setHour", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  public static extern void setHour(int _hour);
   
  [DllImport("ClockTimeDLL.dll", EntryPoint = "ClockTime::getHour", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  public static extern int getHour();
  }
}

编译报错,不知道如何 C#调用C++类,请大家指点


------解决方案--------------------
我也不会,关注中!!!!
------解决方案--------------------
DllImport

可将该属性应用于方法。


------解决方案--------------------

个人觉得,让他们相互调用,还是不太好的!
 因语法不同,
不如,让c++ 的编成控制台,用c#与控制台通迅吧。

------解决方案--------------------
给个例子
C++ 原型
PXRCPU_API int __stdcall PXRSHNMTeleCheckBlank(HANDLE hComm,int iNodeID,unsigned char *cReceiveData,int *iReceiveDataLen,unsigned int iTimeout);

c#
[DllImport("PXRCPU.dll")]
public static extern int PXRSHNMTeleCheckBlank(int hComm, int iNodeID, byte[] cReceiveData,
ref int iReceiveDataLen, uint iTimeout)
------解决方案--------------------
导出类不知道
我是通过一些业务上的设计,改成调用函数,参数和返回值都是基本类型的
------解决方案--------------------
建议你在C++中再创建一个cpp文件用作接口, 你可以起名叫ClockInterface.cpp, 然后通过把定义的几个接口函数设定成为__declspec(dllexport)生成dll文件。

在ClockInterface.cpp中你可以设定函数如下:
extern "C" __declspec(dllexport)void* Clock_Init(void **clk)
{
ClockTime *myClock = new ClockTime();
*clk = myClock;
return clk;
}

这样你就能在C#端控制已生成的ClockTime 实例,通过指针来操作,或更改或删除,通过接口文件很好操作
------解决方案--------------------
[Quote=引用:]
建议你在C++中再创建一个cpp文件用作接口, 你可以起名叫ClockInterface.cpp, 然后通过把定义的几个接口函数设定成为__declspec(dllexport)生成dll文件。

在ClockInterface.cpp中你可以设定函数如下:
C/C++ code

建议你在C++中再创建一个cpp文件用作接口, 你可以起名叫ClockInterface.cpp, 然后通过把定义的几个接口函数设定成为__declspec(dllexport)生成dll文件。

在ClockInterface.cpp中你可以设定函数如下:
extern "C" __declspec(dllexport)void* Clock_Init(void **clk)
{
  ClockTime *myClock = new ClockTime();
  *clk = myClock;
  return clk;
}

这样你就能在C#端控制已生成的ClockTime 实例,通过指针来操作,或更改或删除,通过接口文件很好操作