C++ 如何调用C++;从C#代码获取引用的函数

C++ 如何调用C++;从C#代码获取引用的函数,c++,reference,dllimport,C++,Reference,Dllimport,嗨, 我有一个C++函数,如下: int ShowJob(const JobData& data); 这是如何转换成DLLImport语句的,我可以用它从C#调用函数?我猜它的行为就像引擎盖下的指针,所以就这样对待它吧。具有讽刺意味的是,这是通过将其声明为引用参数来实现的 [DLLImport(DLLName)] public static extern int ShowJob(ref JobData data); 这只有在JobData是一个结构的情况下才能起作用。你死在水里,如果

嗨, 我有一个C++函数,如下:
int ShowJob(const JobData& data);

这是如何转换成DLLImport语句的,我可以用它从C#调用函数?

我猜它的行为就像引擎盖下的指针,所以就这样对待它吧。具有讽刺意味的是,这是通过将其声明为引用参数来实现的

[DLLImport(DLLName)]
public static extern int ShowJob(ref JobData data);

这只有在JobData是一个结构的情况下才能起作用。你死在水里,如果它是一个类,你就不能在C++中创建C++类实例。您没有访问构造函数和析构函数的权限

“const”关键字是C++编译器检查的属性,它与C代码无关。C++引用是引擎下的指针,通过用“REF”声明参数,可以得到一个指针。你很可能会得到“SeJOBJOP”导出名称,通常由C++编译器来修饰。你可以通过在C++代码中用外部“C”预置函数来抑制这种修饰。如果不能更改C++代码,那么可以通过在DLL上运行DuppBI.Exe/Exp出口来找到导出的名称。 综上所述,声明应该类似于这样:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct JobData {
  // members...
}

[DllImport("something.dll", EntryPoint = "?ShowJob@@YAHABUJobData@@@Z", CallingConvention = CallingConvention.Cdecl)]
private static extern int ShowJob(ref JobData data);

Py>猜测的工作在这里进行,你需要用C++的实际代码来验证。如果JobData参数实际上是一个类,那么您需要用C++/CLI语言编写一个ref类包装器。

太好了,谢谢。主要缺失的部分是C++引用是引擎盖下的指针。您是否有一个指向文档页面的链接明确说明了这一点?编译器内部从来没有文档记录,它们是反向工程的。