c++ c#混合编程

发布时间 2024-01-12 14:51:48作者: HRDK

 

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tiny_gltf.h>

#ifdef EXPORT_API
#define EXPORT_DRACO  __declspec(dllexport)
#else
#define EXPORT_DRACO  __declspec(dllimport)
#endif

class EXPORT_DRACO ExportDraco
{
public:
	ExportDraco();
	~ExportDraco();
	int sum;

	int Add(int a,int b);

};

extern "C" EXPORT_DRACO ExportDraco * CreateExportDracoClass();
extern "C" EXPORT_DRACO void DestoryExportDracoClass(ExportDraco * p_ed);
extern "C" EXPORT_DRACO int Add(ExportDraco * p_ed, int a, int b);
#include "ExportDraco.h"
#include <iostream>

ExportDraco::ExportDraco()
{
}

ExportDraco::~ExportDraco()
{
}



EXPORT_DRACO ExportDraco* CreateExportDracoClass()
{
	return new ExportDraco();
}

EXPORT_DRACO void DestoryExportDracoClass(ExportDraco* p_ed)
{
	delete p_ed;
}

EXPORT_DRACO int Add(ExportDraco* p_ed, int a, int b)
{
	return p_ed->Add(a, b);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using TestDllCli;

namespace TestDllCs
{
    internal class Program
    {

        [DllImport("TestDllCpp.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr CreateExportDracoClass();

        [DllImport("TestDllCpp.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void DestoryExportDracoClass(IntPtr intPtr);

        [DllImport("TestDllCpp.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Add(IntPtr intPtr,int a,int b);

        static void Main(string[] args)
        {
            unsafe
            {
                IntPtr exportedClass = CreateExportDracoClass();
                int sum = Add(exportedClass, 1, 4);
                DestoryExportDracoClass(exportedClass);
                Console.ReadKey();
            }
        }
    }
}