c#调用c++程序方法和问题总结

C# 调用C++方法

静态方法调用

  1. 创建一个空的c++项目
    项目结构
    如上图为最终的c++项目结构
  2. 新建Demo.h头文件
#pragma once
extern "C" __declspec(dllexport) int sum(int a, int b);
class Demo {
public:
};

应用程序如果想要访问某dll中的函数,则该函数必须为导出函数。其中__declspec 标识符用来声明这是dll导出函数。

  1. 新建Demo.cpp源文件
#include <iostream>
#include "Demo.h"
using namespace std;


void output()
{
	cout << "hello world" << endl;
}

 int sum(int a, int b)
{
	output();
	return a + b;
}
  1. 编译
    右键点击项目目录-》属性,弹出下图所示弹框:
    属性界面
    配置平台为活动(x64) 配置类型选择 动态库.dll
    属性选择
    编译输出选择编译为C++代码
    最后点击生成-》生成新的解决方案。
  2. 找到c++项目所在文件夹-》x64 -》debug 中生成的dll文件。
    文件结构
    文件结构

注意: 一定要是x64文件夹下的debug中的.dll文件!!如果使用debug文件夹下的.dll文件c#调用会提示“试图加载不正确的文件格式”

  1. 复制dll文件到c#项目中的bin-》debug中。
    vsc文件结构

  2. c#引入dll文件,并调用函数。

using System;
using System.Runtime.InteropServices;

namespace vsc_demo
{
    class Program
    {
        [DllImport("Project1.dll")] //引入dll文件
        static extern int sum(int a ,int b); //声明使用的导出函数
        static void Main(string[] args)
        {
            sum(2,3); //调用函数
            Console.WriteLine("Hello World!");
        }
    }
}

遇到的问题

刚开始c#调用函数一直报试图加载格式不正确的函数或pinvok不对称什么的,按照网上的方法比如:dllimport()中添加CallingConvention = CallingConvention.Cdecl ,但是没有效果。后来想到文件目录X64中的debug跟文件目录下的debug文件夹中的文件可能是不一样的,然后使用项目目录-》x64 -》debug文件夹中的dll文件重新运行了一下,成功!

上述方法中c++代码在vs2019中编辑,c#代码在vscode中编辑。当我想在vs中开发c#窗体程序并调用c++程序时出现了以下问题:
错误代码展示
主要原因在于平台的问题,右键项目-》属性
属性
选择目标平台为x64,因为c++开发函数时选择的平台也是x64,ctrl+s保存设置然后重新运行即可成功。
成功运行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值