HI, 我有一个C ++函数,如下所示:
int ShowJob(const JobData& data);
这如何转换为DLLImport语句,我可以使用它从C#调用该函数?
答案 0 :(得分:2)
我猜它的表现就像引擎盖下的指针一样,所以请对待它。具有讽刺意味的是,这是通过将其声明为引用参数来完成的。
[DLLImport(DLLName)]
public static extern int ShowJob(ref JobData data);
答案 1 :(得分:1)
这仅在JobData是结构时才有效。如果它是一个类,你就死在水中,你不能在C#中创建一个C ++类实例。您无权访问构造函数和析构函数。
“const”关键字是由C ++编译器检查的属性,它与C#代码无关。 C ++引用是引擎盖下的指针,你可以通过用“ref”声明参数来得到一个。您可能在获取“ShowJob”导出名称时遇到问题,它通常由C ++编译器修饰。您可以通过在C ++代码中使用extern“C”作为前缀来禁止该装饰。如果您无法更改C ++代码,则可以通过在DLL上运行Dumpbin.exe / exports找到导出的名称。
把这些全部放在一起,声明应该像这样:
[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);
很多猜测工作正在进行中,您需要使用实际的C ++代码进行验证。如果JobData参数实际上是一个类,那么你需要用C ++ / CLI语言编写一个ref类包装器。