【问题标题】:C++ dll within c#c#中的C++ dll
【发布时间】:2012-09-10 05:56:33
【问题描述】:

我有如下 C++ DLL

#include "stdafx.h"


extern "C" __declspec(dllexport)double Add(double a, double b);


extern double Add(double a, double b) 
{ 
    return a + b; 
} 

n 这里我试图将此 DLL 与我的 C# 应用程序链接

using System.Text;

using System.Runtime.InteropServices; 

namespace test
{

    class Program

    {

        [DllImport("DLL.dll", CallingConvention = CallingConvention.Cdecl)]

        public static extern double Add(double a, double b);  


        static void Main(string[] args)

        {




            Console.WriteLine(Add(1.0, 3.0)); // error here


            Console.ReadLine(); 

        }
    }
}

我遇到错误:

“无法加载 DLL 'DLL.dll':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”

请帮帮我...如何将 c++ dll 与 c# 链接?

【问题讨论】:

  • 只是为了避免混淆DLL被称为“DLL.dll”对吗?
  • 还有,它是在构建的exe文件的路径中吗?
  • @james,您是否通过外部负载测试(例如依赖项步行器)确保不存在 .dll,但 it 所依赖的一切都同样存在? Windows 加载程序有一种可怕的趋势,即不仅在 LoadLibrary 无法加载 .dll 时报告该错误消息,而且如果您的 .dll 所依赖的 .dll 也无法找到,则同样的消息也是如此。你可能想检查一下。
  • 你需要把你的DLL放在调试目录的原因是你没有提供DLL的路径。因此,默认情况下,它会在调试文件夹中查找它的存在。
  • 应用程序必须在某处搜索dll,应用程序目录是一个地方,系统目录是另一个地方。但是,它不会开始在文件系统范围内搜索甚至可能根本不存在的东西。看这里:msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c# c++ dll


【解决方案1】:

调用约定决定了函数参数在函数调用之前如何放置在堆栈中,以及在函数返回时如何删除它们(调用者与被调用者)。您可以在大约一百万个 StackOverflow 问题中找到更多相关信息,或转到 here 并阅读一下。

关于 DLL 在您正在编写的 C#(又名 .NET)应用程序范围内的位置,恐怕我无法对此发表评论,除非说一般 DLL 必须在您的 lib-search 路径中(Windows 中的 PATH )当前目录或内核的主目录(通常是 c:\windows\system32。不要将文件复制到 system32,顺便说一句。只需将您的应用程序设置为“从”您的 DLL 所在的目录“运行”就可以了。这个例外,配置设置可以从根本上改变这一点,但如果你是我,我现在会坚持简单。复杂总是可以稍后出现。

【讨论】:

    【解决方案2】:

    您要么需要将 dll 植入 C# exe 所在的位置,要么将 dll 打包到 exe 中。第一个选项很简单。对于第二个选项,请查看Embedding DLL's into .exe in in Visual C# 2010

    【讨论】:

      【解决方案3】:

      您收到此错误是因为 DLL.dll 不在您的调试/发布文件夹中,

      据我所知,Visual Studio 不知道如何手动将这些文件复制到您的输出文件夹。

      将 dll 文件添加到您的 C# 解决方案中

      然后在 files properties 上将 build action 设置为 content 并将copy to output directory 设置为copy if newer 这将自动复制

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 2018-04-14
        • 2015-03-17
        • 1970-01-01
        • 2010-11-06
        • 2020-10-14
        • 1970-01-01
        相关资源
        最近更新 更多