给定 foo.dll 中的以下 c++ 类
class a{
private:
int _answer;
public:
a(int answer) { _answer = answer; }
__declspec(dllexport) int GetAnswer() { return _answer; }
}
我想要来自 C# 的 pInvoke GetAnswer。为此,我使用以下方法:
[DllImport("foo.dll", CallingConvention = CallingConvention.ThisCall, EntryPoint= "something")]
public static extern int GetAnswer(IntPtr thisA);
然后我传入一个指向 a 的 IntPtr (我从其他地方得到的,这并不重要)。 CallingConvention = CallingConvention.ThisCall
确保正确处理
这个问题很酷的是,我知道到目前为止我是对的,因为它已经很好用了! 使用 Depends.exe,我可以看到“GetAnswer”被导出为 ?GetAnswer@a@@UAEHXZ (或类似的东西 - 关键是它的名称已被破坏)。当我将损坏的名称插入 EntryPoint 的“某物”时,一切正常!我花了大约一天的时间才意识到使用 Depends.exe,所以我将把它留在这里,以帮助遇到类似问题的任何人。
我真正的问题是: 有什么方法可以在 GetAnswer 上禁用 C++ 名称修改,这样我就不需要将修改后的名称作为我的入口点。那里有重整的名称似乎可能会破坏,因为我对名称重整的理解是,如果编译器发生变化,它可能会改变。此外,对我想要 pInvoke 的每个实例方法使用 Depends.exe 也很痛苦。
编辑:忘记添加我尝试过的内容:我似乎无法将 extern "C" 放在函数声明中,尽管我可以将其粘贴在定义上。这似乎没有帮助(当你考虑它时很明显)
我能想到的唯一其他解决方案是包装实例方法并将 a 的实例作为参数的 c 样式函数。然后,禁用该包装器上的名称修饰并 pInvoke 。不过,我宁愿坚持我已经拥有的解决方案。我已经告诉我的同事 pInvoke 很棒。如果我必须在我们的 c++ 库中放入特殊函数以使 pInvoke 工作,我会看起来像个白痴。