gaerelva 2024-07-12 16:19 采纳率: 83.3%
浏览 6
已结题

c# 类库 直接使用 c++ 中class

c++项目为动态类库项目
代码大概如下 手打 语法标点有错误,
complex.h
public class complex
{
public:
double cfabs()
{double y=sqrt(88.88);
return y}
}
cpp 文件为空,
其实我都就想把功能都写到 h 文件内

然后 c#项目 直接引用dll项目
然后声明
complex c1
然后想c1.cfabs 这样 可以实现么?我不想在cpp里面再写pubulic function 在暴漏出来。只想使用c++的class 当c#的class

  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-07-12 16:20
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户的问题涉及到在C++项目中定义一个类,并希望在C#项目中直接使用这个C++类,而不需要在C++的.cpp文件中再写公共函数来暴露类的方法。用户希望将所有功能都写在.h文件中,并直接在C#中调用这个类的方法。

    解决方案

    要在C#中直接使用C++的类,通常需要通过P/Invoke(平台调用)来实现。但是,P/Invoke主要用于调用C风格的函数,而不是C++的类。为了在C#中使用C++的类,我们需要将C++类封装成C风格的接口,然后在C#中通过P/Invoke调用这些接口。

    1. 修改C++代码

    首先,我们需要修改C++代码,将类的方法封装成C风格的函数。

    complex.h

    #pragma once
    #include <cmath>
    
    extern "C" {
        class complex {
        public:
            double cfabs() {
                double y = std::sqrt(88.88);
                return y;
            }
        };
    
        // 封装C风格的接口
        complex* create_complex() {
            return new complex();
        }
    
        void delete_complex(complex* obj) {
            delete obj;
        }
    
        double call_cfabs(complex* obj) {
            return obj->cfabs();
        }
    }
    

    2. 编译C++代码为DLL

    将上述代码编译成DLL文件。确保在编译时使用extern "C"来避免C++名称修饰。

    3. 在C#中使用DLL

    在C#项目中,通过P/Invoke来调用C++的DLL。

    Program.cs

    using System;
    using System.Runtime.InteropServices;
    
    class Program
    {
        [DllImport("YourCppDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr create_complex();
    
        [DllImport("YourCppDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void delete_complex(IntPtr obj);
    
        [DllImport("YourCppDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double call_cfabs(IntPtr obj);
    
        static void Main()
        {
            IntPtr c1 = create_complex();
            double result = call_cfabs(c1);
            Console.WriteLine("Result: " + result);
            delete_complex(c1);
        }
    }
    

    总结

    通过上述步骤,我们可以在C#中直接使用C++的类。关键在于将C++类的方法封装成C风格的函数,并通过P/Invoke在C#中调用这些函数。这样,用户可以在C#中直接使用C++的类,而不需要在C++的.cpp文件中再写公共函数来暴露类的方法。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月24日
  • 已采纳回答 7月16日
  • 创建了问题 7月12日

悬赏问题

  • ¥15 TeleScan不能修改bar
  • ¥100 请问我基于逐飞库写的这个有关于mp u6050传感器的函数,为什么输出的值是固定的?
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息
  • ¥15 Spring Boot离线人脸识别
  • ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因
  • ¥15 NRF24L01能发送但是不能接收
  • ¥15 想问一下这种情况怎么解决呢(关键词-file)