开发者

C#调用C++使用C++/CLI的实现

目录
  • 简介
  • 新建解决方案->CSharpCPlusSolution
  • 新建动态链接库(DLL)->CPlusNative
    • 新建类NativeCalculate
  • 新建CLI类库(DLL)->CPlusWrapper
    • 添加包含目录 NativeCalculate.h
    • 添加 CPl编程客栈usNative.lib附加库目录
    • 添加附加库依赖项 CPlusNative.lib
    • 创建包装类NativeCPlusWhvtZfbYYrapper
  • 新建C# 控制台项目 CSharpConsphpoleApp
    • 添加CPlusWrapper.dll引用
  • 常见错误

    简介

    C++/CLI(C++ Common Language Infrastructure)是一种允许在 .NET 平台上创建托管代码(managed code)和非托管代码(unmanaged code)之间互操作的语言。其原理可以概括如下:

    • 编译器支持: C++/CLI 编译器能够编译同时包含托管和非托管代码的源文件。这使得在同一个项目中可以混合使用 C++ 和 C# 或其他 .NET 语言。

    • 托管和非托管代码的桥梁: C++/CLI 提供了语法和关键字,允许你在同一个文件中编写托管代码和非托管代码。这些代码可以相互调用,使得 C# 和 C++ 之间的交互变得简单。

    • CLR(Common Language Runtime)集成: C++/CLI 代码在编译时会生成对 CLR 的调用,因此它可以利用 CLR 提供的各种功能,例如垃圾回收、类型安全性和异常处理等。

    • 托管代码的封装: 在 C++/CLI 中,你可以将非托管的 C++ 代码封装在托管的类中,通过公共接口暴露给其他 .NET 语言。这样,C++ 的功能可以被其他 .NET 语言轻松调用和使用。

    • 数据类型转换: C++/CLI 提供了一组转换操作符和工具,用于在托管代码和非托管代码之间进行数据类型的转换。这样,你可以在 C++/CLI 中轻松处理 C# 中的数据类型,反之亦然。

    • 资源管理: 在 C++/CLI 中,你可以使用托管的资源管理功能(如 gcnew&www.devze.comnbsp;创建托管对象和 delete 销毁对象),同时也可以手动管理非托管资源(如使用析构函数释放内存)。

    新建解决方案->CSharpCPlusSolution

    C#调用C++使用C++/CLI的实现

    新建动态链接库(DLL)->CPlusNative

    C#调用C++使用C++/CLI的实现

    新建类NativeCalculate

    //NativeCalculate.h
    
    #pragma once
    #ifndef NATIVE_CLASS_H
    #define NATIVE_CLASS_H
    
    class __declspec(dllexport) NativeCalculate {
    public:
    static int Add(int a, int b);
    };
    
    #endif // NATIVE_CLASS_H
    //NativeCalculate.cpp
    
    #include "pch.h"
    #include "NativeCalculate.h"
    
    int NativeCalculate::Add(int a, int b) {
        return a + b;
    }

    Build CPlusNative项目确保能成功生成CPlusNative.dll和CPlusNative.lib文件

    新建CLI类库(DLL)->CPlusWrapper

    C#调用C++使用C++/CLI的实现

    添加包含目录 NativeCalculate.h

    C#调用C++使用C++/CLI的实现

    添加 CPlusNative.lib附加库目录

    C#调用C++使用C++/CLI的实现

    添加附加库依赖项 CPlusNative.lib

    C#调用C++使用C++/CLI的实现

    创建包装类NativeCPlusWrapper

    上述配置完毕后,CPlusWrapper项目创建包装类NativeCPlusWrapper

    //NativeCPlusWrapper.h
    
    #pragma once
    using namespace System;
    namespace CPlusWrapper {
        public ref class NativeCPlusWrapper
        {
        public:
            static int Add(int a, int b);
        };
    }
    //CPlusWrapper.cpp
    
    #include "pch.h"
    #include "NativeCPlusWrapper.h"
    #include "NativeCalculate.h"
    
    using namespace CPlusWrapper;
    
    int NativeCPlusWrapper::Add(int a, int b) {
        int sum = 0;
        sumjs = NativeCalculate::Add(a, b);
        return sum;
    }

    Build CPlusWrapper项目确保能成功生成CPlusWrapper.dll文件

    新建C# 控制台项目 CSharpConsoleApp

    添加CPlusWrapper.dll引用

    C#调用C++使用C++/CLI的实现

    CSharpConsoleApp项目调用NativeCPlusWrapper方法

    namespace CSharpConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                int sum = CPlusWrapper.NativeCPlusWrapper.Add(33, 66);
            }
        }
    }

    常见错误

    C#调用C++使用C++/CLI的实现

    程序运行目录找不到CPlusNative.dll所以报错

    C#调用C++使用C++/CLI的实现

    拷贝CPlusNative.dll 到 Debug目录下即可

    或者使用Pre-build event command line

    C#调用C++使用C++/CLI的实现

    "$(ProjectDir)..\Debug\CPlusNative.dll" "$(TargetDir)"

    到此这篇关于C#调用C++使用C++/CLI的实现的文章就介绍到这了,更多相关C#调用C++ 内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜