我目前正在使用PInvoke从C++调用C#中的一些非托管函数,特别是从PhysX 3.3.3调用。我对PInvoke比较陌生,所以我从一些简单的方法开始。我可以很容易地调用函数,这些函数不需要参数,但是调用任何参数都有困难。
从简单开始,我使用了一个以布尔值传递的函数,发现布尔函数是不可闪存的类型,因此必须对它们进行封送。但是,将布尔封送处理添加到PInvoke签名仍然不起作用。
[DllImport("PhysX3CommonCHECKED_x64.dll", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?getReportAllocationNames@Foundation@shdfnd@physx@@UEBA_NXZ")]
public static extern bool GetAllocationNames();
[DllImport("PhysX3CommonCHECKED_x64.dll", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?setReportAllocationNames@Foundation@shdfnd@physx@@UEAAX_N@Z")]
public static extern void SetAllocationNames([MarshalAs(UnmanagedType.U1)]bool name);当我调用SetAllocationNames(真)时,我得到一个SetAllocationNames我还尝试为UnmanagedType枚举使用其他成员名(例如,U1、Bool),但没有结果。
我在调用函数之前加载DLL,我使用正确的故障名称作为入口点,并调用与此函数相关的所有参数(本例中只有一个)。还有什么东西我遗漏了吗?
发布于 2015-07-01 17:59:41
不幸的是,如果C++库是用不同的编译器编译的(更糟糕的是,同一个编译器的不同版本),而单独使用PInvoke,则很难与其他C++应用程序共享它们。
其次,你甚至还不太擅长解决这个问题。C++(在x86中)对方法(属于类的函数)的调用约定是这个电话,这意味着this (调用方法的类)通过ecx或rcx寄存器传递。cdecl没有传递一个。其次,您甚至没有定义适当的类.
您应该做的是编写一个C++包装器
编写函数,而不是方法(即不绑定到任何类或结构),这些函数可以执行您需要完成的任何操作,并确保您知道它们的调用约定(使其成为常规的方法,比如cdecl或fastcall)。这样您就可以编写C/C++代码为您完成工作,并使用C#编写PInvoke。
发布于 2015-06-30 22:26:03
好吧,我想我现在明白了。经过进一步的研究,继承的函数似乎对PInvoke来说是有问题的。许多源建议将C++代码扁平化为C风格的接口。我将不得不使用C++/CLI项目。谢谢!
https://stackoverflow.com/questions/31144481
复制相似问题