首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在对带有参数的函数使用AccessViolationException时

在对带有参数的函数使用AccessViolationException时
EN

Stack Overflow用户
提问于 2015-06-30 17:19:54
回答 2查看 173关注 0票数 2

我目前正在使用PInvoke从C++调用C#中的一些非托管函数,特别是从PhysX 3.3.3调用。我对PInvoke比较陌生,所以我从一些简单的方法开始。我可以很容易地调用函数,这些函数不需要参数,但是调用任何参数都有困难。

从简单开始,我使用了一个以布尔值传递的函数,发现布尔函数是不可闪存的类型,因此必须对它们进行封送。但是,将布尔封送处理添加到PInvoke签名仍然不起作用。

代码语言:javascript
复制
[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,我使用正确的故障名称作为入口点,并调用与此函数相关的所有参数(本例中只有一个)。还有什么东西我遗漏了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-01 17:59:41

不幸的是,如果C++库是用不同的编译器编译的(更糟糕的是,同一个编译器的不同版本),而单独使用PInvoke,则很难与其他C++应用程序共享它们。

其次,你甚至还不太擅长解决这个问题。C++(在x86中)对方法(属于类的函数)的调用约定是这个电话,这意味着this (调用方法的类)通过ecxrcx寄存器传递。cdecl没有传递一个。其次,您甚至没有定义适当的类.

您应该做的是编写一个C++包装器

编写函数,而不是方法(即不绑定到任何类或结构),这些函数可以执行您需要完成的任何操作,并确保您知道它们的调用约定(使其成为常规的方法,比如cdeclfastcall)。这样您就可以编写C/C++代码为您完成工作,并使用C#编写PInvoke

票数 0
EN

Stack Overflow用户

发布于 2015-06-30 22:26:03

好吧,我想我现在明白了。经过进一步的研究,继承的函数似乎对PInvoke来说是有问题的。许多源建议将C++代码扁平化为C风格的接口。我将不得不使用C++/CLI项目。谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31144481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档