添加 C++ DLL 作为对 C# 的引用在 x86 上有效,但在 x64 上失败

问题描述 投票:0回答:1

使用 Microsoft Visual Studio Professional 2019:

用C++创建了一个简单的加法函数来生成DLL文件。 在一个新的C#项目中,引用上面的DLL文件。

Win32:对于 C++ DLL 和 C# 程序,当活动平台设置为 Win32 时,可以使用引用管理器中的“添加引用”。该项目构建并运行没有任何问题。

x64:对于 C++ DLL 和 C# 程序,当活动平台设置为 x64 时,尝试在引用管理器中使用“添加引用”会导致弹出错误
image

并且引用未添加到项目中。

对于我的工作,我需要使用 x64。我应该调整哪些设置才能实现这一点?

CPP文件:

#include "pch.h"
#include "Divide.h"

Divide::Divide(int x) {
    this->x = x;
}

int Divide::adding(int y) {
    return this->x + y;
}

int Divide::get() {
    return this->x;
}


extern "C" __declspec(dllexport) void* Create(int x) {
    return (void*) new Divide(x);
}
extern "C" __declspec(dllexport) int DivideAdding(Divide * a, int y) {
    return a->adding(y);
}
extern "C" __declspec(dllexport) int DivideGet(Divide * a) {
    return a->get();
}

头文件:

class Divide {
    int x;
public:
    Divide(int x);
    int adding(int y);
    int get();
};

在 C# 中:

[DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr Create(int x);

        [DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int DivideAdding(IntPtr a, int y);

        [DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int DivideGet(IntPtr a);

        static void Main(string[] args)
        {
            try
            {
                IntPtr a = Create(5);
                int temp = DivideGet(a);
                Console.WriteLine("Initial:" + temp);
                DivideAdding(a, 10);

对于我的工作,我需要使用 x64。我应该调整哪些设置才能实现这一点? 如果您需要更多信息,请告诉我。

c# c++ visual-studio-2019 dllimport dllexport
1个回答
0
投票

在 C# 项目中,

Add reference
用于托管 DLL。

添加 C++ 非托管 DLL 将导致警告或错误。

Visual Studio 2022:

enter image description here

enter image description here

您需要将 C++ DLL 复制到输出文件夹。项目 -> 添加现有项目。将添加项目的“复制到输出目录”属性设置为“如果较新则复制”,

并确保C#项目架构与C++ DLL一致。

© www.soinside.com 2019 - 2024. All rights reserved.