好的我正在尝试创建一个C ++ DLL,然后我可以在c#App中调用和引用它。我已经使用了很多指南制作了一个简单的dll,但是当我尝试在C#应用程序中引用它时,我得到了错误
无法加载DLL“SDES.dll”:找不到指定的模块。
该程序的代码如下(请耐心等待我将包括所有文件)
//These are the DLL Files.
#ifndef TestDLL_H
#define TestDLL_H
extern "C"
{
// Returns a + b
__declspec(dllexport) double Add(double a, double b);
// Returns a - b
__declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
__declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllexport) double Divide(double a, double b);
}
#endif
//.cpp
#include "test.h"
#include <stdexcept>
using namespace std;
extern double __cdecl Add(double a, double b)
{
return a + b;
}
extern double __cdecl Subtract(double a, double b)
{
return a - b;
}
extern double __cdecl Multiply(double a, double b)
{
return a * b;
}
extern double __cdecl Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
//C# Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("SDES.dll")]
public static extern double Add(double a, double b);
static void Main(string[] args)
{
Add(1, 2); //Error here...
}
}
}
任何人都知道我的计划中可能缺少什么?如果我错过了一些代码或者您有任何问题,请告诉我。
答案 0 :(得分:5)
下载Dependecy Walker并打开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中所做的:
将此P / Invoke签名添加到C#文件中:
[DllImport("Native_CPP.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern double Add(double a, double b);
注意:我必须传递参数CallingConvention.Cdecl
,否则我会得到一个
异常。
答案 1 :(得分:0)
这意味着当它试图加载dll时,它无法找到它!
http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx
很可能与C#app不在同一目录中。
还有,提及的好时机
http://www.dependencywalker.com/
有助于发现DLL依赖问题。
答案 2 :(得分:0)
将SDES.dll
放到放置C#.exe的文件夹中。
答案 3 :(得分:0)
SimulateGameDLL
在哪里定义?我没有在C / C ++代码中看到它。
答案 4 :(得分:0)
我刚刚编译了代码,没有出错。这是我的命令行。
> cl /LD test.cpp -o SDES.dll
> csc test.cs
> test.exe