在C#应用程序中只能使用C ++ DLL的1/4函数

时间:2013-03-14 15:44:22

标签: c# c++ dll pinvoke dllimport

转换C ++ DLL以便在C#中使用时遇到一些麻烦。

它正在工作.. DLL中的第一个C ++函数只是:int subtractInts(int x, int y)并且它的典型正文没有问题。所有其他功能都很简单并且已经过测试。但是,我一直在关注一个教程并做一些时髦的事情,将C#中的代码用作C ++ DLL(为了便携性)。

我的步骤是:

•创建一个C ++类,测试并保存它 - 只使用'class.cpp'和'class.h'文件 •在Visual Studio 2010中创建一个Win32库项目,在启动时选择DLL,并为我要向C#公开的每个函数选择..以下代码

extern "C" __declspec(dllexport) int addInts(int x, int y)
extern "C" __declspec(dllexport) int multiplyInts(int x, int y)
extern "C" __declspec(dllexport) int subtractInts(int x, int y)
extern "C" __declspec(dllexport) string returnTestString()

非常关键的一点,就是我在我的DLL中驱逐它们的顺序。

然后作为测试因为我之前确实遇到过这个问题..我在C#项目中以不同的方式引用它们

   [DllImport("C:\\cppdll\\test1\\testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]

    public static extern int subtractInts(int x, int y);
    public static extern int multiplyints(int x, int y);
    public static extern int addints(int x, int y);
    public static extern string returnteststring();

从C#调用时起作用的ONLY函数是subtractInts,这显然是首先引用的函数。所有其他人在编译时都会导致错误(见下文)。

如果我没有注释掉上面的代码并去外部引用所有这些功能。我在multipyInts(int x,int y)中得到以下错误。

Could not load type 'test1DLL_highest.Form1' from assembly 'test1DLL_highest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'multiplyints' has no implementation (no RVA).

我会想象排序可以排序所有内容。

干杯。

1 个答案:

答案 0 :(得分:5)

您需要将DllImportAttribute添加到所有四种方法,删除路径并修复外壳:

[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int subtractInts(int x, int y);
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int multiplyInts(int x, int y);
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int addInts(int x, int y);
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string returnTestString();

还要确保本机DLL与托管程序集位于同一位置(或通过常规DLL发现方法发现)。