• C#调用C++方法,C#使用c++方法返回类或结构体


    C#调用C++方法,C#使用c++方法返回类或结构体。

    1. 在c++中定义结构体,类,处理方法;要给c#调用的方法要加extern "C" __declspec(dllexport) 修饰

    // CppDll.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    
    
    #define EXPORT_DLL extern "C" __declspec(dllexport) 
    
    //暴露的方法调用
    EXPORT_DLL int Add(int a,int b)
    {
    	return a + b;
    }
    
    //返回数据结构定义
    struct Bar
    {
    public :
    	int id;
    	char* name;
    };
    
    //使用引用返回结构
    EXPORT_DLL void GetBar(Bar& bar)
    {
    	//Bar b;
    	bar.id = 10;
    	bar.name = "hi bar 中文了";
    
    	//bar = b;
    }
    
    //返回类
    class Foo
    {
    public :
    	int id;
    	char* name;
    };
    
    //引用返回类
    EXPORT_DLL void GetFoo(Foo& foo)
    {
    	foo.id = 100;
    	foo.name = "I'm 傻瓜";
    }
    

    2. 在C#中使用C++方法,首先需要定义C++中的Foo(在c++中定义为类class),Bar(在C++中定义为struct)对应的数据结构struct;然后定义extern的方法,如下代码所示:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace UseCppDll
    {
        [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
        public struct Bar
        {
    
            /// int
            public int id;
    
            /// char*
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
            public string name;
        }
    
    
        [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
        public struct Foo
        {
    
            /// int
            public int id;
    
            /// char*
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
            public string name;
        }
    
        class Program
        {
            [DllImport("CppDll.dll",EntryPoint="Add")]
            extern static int Add(int a, int b);
    
            [DllImport("CppDll.dll", EntryPoint = "GetBar",CharSet=CharSet.Ansi)]
            extern static void GetBar(ref Bar bar);
    
            [DllImport("CppDll.dll", EntryPoint = "GetFoo", CharSet = CharSet.Ansi)]
            extern static void GetFoo(ref Foo foo);
    
    
            static void Main(string[] args)
            {
                Console.WriteLine(Add(5,4));
    
                Bar b = new Bar();
                GetBar(ref b);
                Console.WriteLine("b's id is " + b.id);
                Console.WriteLine("b's name is " + b.name);
    
                Foo f = new Foo();
                GetFoo(ref f);
                Console.WriteLine("f's id is " + f.id);
                Console.WriteLine("f's name is " + f.name);
    
                Console.Read();
            }
        }
    }
    

    C++中的类或者结构在C#中的定义代码可以使用微软提供的工具(P/Invoke Interop Assistant)生成。

    在运行C#程序前要把C++dll复制到C#程序运行目录下。

  • 相关阅读:
    elasticsearch之建议器Suggester
    elasticsearch,kibana之相关配置
    elasticsearch之分析过程
    elasticsearch之mappings
    elasticsearch for Mac OS
    项目精讲
    博客园项目开发流程
    Django之auth模块
    DJango中间件
    DJango之模板层
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/csharp_call_cpp_class_struct.html
Copyright © 2020-2023  润新知