//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++类,请大家指点

解决方案 »

  1.   

    DllImport可将该属性应用于方法。
      

  2.   

    不太清楚,请问,下面的如何改,请给一个例子
    [DllImport("ClockTimeDLL.dll", EntryPoint = "ClockTime", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
      public extern class ClockTime;
      

  3.   

    给个例子
    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)
      

  4.   

    建议你在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 实例,通过指针来操作,或更改或删除,通过接口文件很好操作
      

  5.   

    感谢xinen8721同学,项目需要今天参考了本文测试通过的代码。C++定义:
    ////////////////////////////////////////////////////////
    //自定义类别的头文件 WebICAdapter.h
    #ifdef DLL_API
    #else
    #define DLL_API extern "C" __declspec(dllexport)
    #endifclass WebICAdapter
    {
    public:
    WebICAdapter(void);
    ~WebICAdapter(void);
    // 测试add函数
    int add(int p1, int p2);
    };// 返回类别的实例指针
    DLL_API void* classInit(void **clsp);
    DLL_API int add(WebICAdapter* p, int p1, int p2);////////////////////////////////////////////////////////
    //自定义类别的头文件 WebICAdapter.cpp
    //=========导出函数============
    // 返回类别的实例指针
    void* classInit(void **clsp)
    {
    WebICAdapter* p = new WebICAdapter();
    *clsp = p;
    return clsp;
    }
    int add(WebICAdapter* p, int p1, int p2)
    {
    return p->add(p1,p2);
    }
    //==========类别实现===========
    WebICAdapter::WebICAdapter(void)
    {
    }
    WebICAdapter::~WebICAdapter(void)
    {
    }
    // 测试add函数
    int WebICAdapter::add(int p1, int p2)
    {
    return p1+p2;
    }C#定义和调用:
    ////////////////////////////////////////////////////////
    using System.Runtime.InteropServices;
    ......
            //--------------DLL接口定义-----------
            [DllImport("SWWebICAdapter.dll", EntryPoint = "classInit", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int classInit(ref int clsPoint);        [DllImport("SWWebICAdapter.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int add(ref int clsPoint, int p1, int p2);
            // DLL中的类实例指针
            private int _clsPoint = 0;        // -----------------------------------
            public SWWebIC()
            {
                InitializeComponent();
                // 初始化DLL类实例
                _clsPoint = classInit(ref _clsPoint);
            }
    ......
            private void buttonDevice_Click(object sender, EventArgs e)
            {
                int n = add(ref _clsPoint, 11, 12);
                MessageBox.Show("计算结果:" + n);
    }