C# 调用C++方法
静态方法调用
- 创建一个空的c++项目
如上图为最终的c++项目结构 - 新建Demo.h头文件
#pragma once
extern "C" __declspec(dllexport) int sum(int a, int b);
class Demo {
public:
};
应用程序如果想要访问某dll中的函数,则该函数必须为导出函数。其中__declspec 标识符用来声明这是dll导出函数。
- 新建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;
}
- 编译
右键点击项目目录-》属性,弹出下图所示弹框:
配置平台为活动(x64) 配置类型选择 动态库.dll
编译输出选择编译为C++代码
最后点击生成-》生成新的解决方案。 - 找到c++项目所在文件夹-》x64 -》debug 中生成的dll文件。
注意: 一定要是x64文件夹下的debug中的.dll文件!!如果使用debug文件夹下的.dll文件c#调用会提示“试图加载不正确的文件格式”
-
复制dll文件到c#项目中的bin-》debug中。
-
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保存设置然后重新运行即可成功。