创建一个C++;DLL,然后在C中使用它# OK,我尝试制作一个C++ DLL,然后在C应用程序中调用和引用。我已经使用大量的指南制作了一个简单的dll,但是当我试图在C#app中引用它时,我得到了错误

创建一个C++;DLL,然后在C中使用它# OK,我尝试制作一个C++ DLL,然后在C应用程序中调用和引用。我已经使用大量的指南制作了一个简单的dll,但是当我试图在C#app中引用它时,我得到了错误,c#,c++,dll,C#,C++,Dll,无法加载DLL“SDES.DLL”:找不到指定的模块 该程序的代码如下(请放心,我将包括所有文件) //这些是DLL文件。 #ifndef测试DLL\U H #定义TestDLL_H 外部“C” { //返回a+b __declspec(dllexport)双加(double a,double b); //返回a-b __declspec(dllexport)双减法(双a,双b); //返回a*b __declspec(dllexport)双倍乘法(双a,双b); //返回a/b //如果b为0

无法加载DLL“SDES.DLL”:找不到指定的模块

该程序的代码如下(请放心,我将包括所有文件)

//这些是DLL文件。
#ifndef测试DLL\U H
#定义TestDLL_H
外部“C”
{
//返回a+b
__declspec(dllexport)双加(double a,double b);
//返回a-b
__declspec(dllexport)双减法(双a,双b);
//返回a*b
__declspec(dllexport)双倍乘法(双a,双b);
//返回a/b
//如果b为0,则引发DivideByZeroException
__declspec(dllexport)双除法(双a,双b);
}
#恩迪夫
//.cpp
#包括“test.h”
#包括
使用名称空间std;
外部双重cdecl添加(双重a,双重b)
{
返回a+b;
}
外部双精度cdecl减法(双精度a,双精度b)
{
返回a-b;
}
外部双循环cdecl乘法(双循环a,双循环b)
{
返回a*b;
}
外部双除法(双a,双b)
{
如果(b==0)
{
抛出新的无效参数(“b不能为零!”);
}
返回a/b;
}
//C#程序
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Runtime.InteropServices;
命名空间控制台应用程序1
{
班级计划
{
[DllImport(“SDES.dll”)]
公共静态外部双加(双a,双b);
静态void Main(字符串[]参数)
{
添加(1,2);//此处出错。。。
}
}
}

有人知道我的计划中可能遗漏了什么吗?如果我遗漏了一些代码或您有任何问题,请告诉我。

这意味着当它试图加载dll时,它找不到它

很可能它与您的C#应用程序不在同一目录中

还有,是时候提一下了


帮助查找DLL依赖关系问题。

SDES.DLL
放入放置C#exe的文件夹

哪里定义了
simulategamedell
?我在C/C++代码中没有看到它。

我只是编译了代码,没有得到任何错误。这是我的命令行

> cl /LD test.cpp -o SDES.dll
> csc test.cs
> test.exe
下载并打开您的
SDES.dll
。检查是否可以加载所有从属DLL。如果发现缺少依赖项,请将该dll也放在目标目录中

您使用的是64位系统吗?如果是,则应该将C++和C++的目标指向同一架构(32位或64位)。 我刚刚测试了你的功能,结果成功了

    [DllImport("Native_CPP.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));

        Console.ReadLine();
    }
输出:

4
这就是我对Visual Studio 2010所做的:

  • 创建一个新的解决方案

  • 创建一个新的C#项目

  • 创建一个新的C++-Dll项目(没有MFC和其他东西)

  • 复制粘贴头文件和cpp文件

  • 构建C++-Dll

  • 将DLL复制到调试/发布(取决于您使用的)目录 您的C#项目(通常分别为“Solution/CSharpProjectName/bin/Debug/”或“Solution/CSharpProjectName/bin/Release/”)

  • 将此p/Invoke签名添加到C#文件:

    [DllImport(“Native_CPP.dll”,CallingConvention=CallingConvention.Cdecl)]
    公共静态外部双加(双a,双b)

    注意:我必须传递参数
    CallingConvention.Cdecl
    ,否则我会得到一个 例外

  • 如上图所示运行C#-项目


附言:我不需要设置架构。它只是起作用了。(我使用的是64位操作系统的x64机器。)

感谢您指出这一点。我尝试了一个不同的教程,但忘了把它改回来。我已经编辑了我的原始文章,以反映它应该是什么,但我仍然得到相同的问题。至于将dll放在与.exe相同的文件夹中,我已经这样做了,但仍然遇到相同的问题。您是否使用了命令控制台,或者这是您添加到项目属性中的内容?我只是使用了命令行,如上图所示。如果您使用的是VS,则可能启用了太多选项:)可能。当我在命令提示符下尝试命令cl/LD test.cpp-o SDES.dll时,我收到一条错误消息,它无法识别命令cl。我是否缺少扩展名?从“开始”菜单中,运行类似于此的“visual studio命令工具”以获得VC命令行环境。谢谢。我运行了这些命令和第一个命令(cl/LD test.cpp-o SDES.dll),它导致以下cl:命令行警告D9002:忽略未知选项“-0”cl:命令行警告D9024:无法识别的源文件类型“SDES.dll”,obje ct文件假定为test.cpp c1xx:致命错误C1083:无法打开源文件:“test.cpp”:没有这样的文件或d directorydid它。当我打开SDES.dll时,它给出了以下错误:错误:未找到至少一个必需的隐式或转发依赖项。带有问号图标的dll是MSVCR90D.dll。我在项目解决方案中包含了这个dll(在快速搜索我的计算机后),但我仍然有相同的问题。好的。。。“项目解决方案”是指与SDES.dll相同的目录吗?然而,依赖者不应该再抱怨了。是的。很抱歉没有具体说明。我的笔记本电脑(我用来设计程序的系统)是64位的。我有两个目标,以任何CPU。你认为把这个切换到目标64会改变我面临的问题的本质吗?MVCRT90.DLL是C++运行时,它可能被“PosieNealValueAdjMUTMUTE())调用使用。或者复制MSCVRT90.DLL到C++ exe旁边,并在清单文件中指定它,或者安装Visual C++ 2008可重分发组件
4