尝试将 c++ dll 导入 c-sharp 代码

Posted

技术标签:

【中文标题】尝试将 c++ dll 导入 c-sharp 代码【英文标题】:Trying to import a c++ dll to a c-sharp code 【发布时间】:2017-05-21 17:27:40 【问题描述】:

我试图做一个最简单的例子,以便我开始理解这是如何完成的。在网上搜索我只找到了我不太了解的示例。

这是 C++ 代码,在 C++ 类库项目中。

#include "stdafx.h"
#include <iostream>
#include "ClassLibrary1.h"
using namespace std;

extern "C"  
    void CallMe()
    
        cout << "I am the called function! Hooray!" << endl;
    

这是 C# 控制台应用程序代码:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("calling dll");
            CallMe();
            Console.ReadLine();
        

        [DllImport("ClassLibrary1.dll")]
        public static extern void CallMe();
    

我将 dll 添加为对 C# 项目的引用,并将其与可执行文件放在同一文件夹中。

我仍然收到“无法加载 DLL “ClassLibrary1.dll”:找不到指定的模块(HRESULT 异常:0x8007007E)。 p>

我错过了什么?

我尝试在 C++ 代码中的 CallMe 声明之前添加“__declspec(dllexport)”,但没有成功。

【问题讨论】:

ClassLibrary1.dll 未复制到 C# 项目输出目录,或者您的平台不匹配,这意味着 C# 以 64 位运行,而您的 DLL 为 32 位(或其他方式) .这是加载问题而不是导出符号问题,我强烈认为这是平台不匹配问题。 您的 DLL 在哪里?该位置是否在 PATH 变量中? 您的安装中可能缺少 VCRedist 软件包。如果你在同一台机器上构建所有东西,那就奇怪了。 为什么添加它作为参考?这肯定是一个非托管库。还是不是? @πάνταῥεῖ - 你是对的,我不小心将 dll 放在了错误的文件夹中。但我仍然收到另一个错误,请检查编辑 【参考方案1】:

(代表 OP 发布)

解决方案分别是:

我仍然收到“无法加载 DLL “ClassLibrary1.dll”:找不到指定的模块(HRESULT 异常:0x8007007E)”。

错误 #1:dll 放置错误,抱歉。

现在我收到一个新错误:“尝试加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)”

错误 #2:c++ 代码编译为 x86,而不是 x64,非常抱歉。

我现在收到错误:“无法在 dll 中找到名为“CallMe”的输入点”

错误 #3:在声明/定义函数时必须输入“__declspec(dllexport)”。

【讨论】:

以上是关于尝试将 c++ dll 导入 c-sharp 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何将外部 dll 库导入 Borland C++ 6?

调试由 C# Visual Studio 2010 插件导入的 C++ dll

如何将.lib 导入.dll?

Visual C++ - 覆盖从 DLL 导入的函数?

如何从 C# 导入和使用非托管 C++ 类?

托管 C++ - 根据配置文件导入不同的 DLL