转换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).
我会想象排序可以排序所有内容。
干杯。
答案 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发现方法发现)。