c# - SWIG、Box2D 和 C#

标签 c# c++ box2d swig

本来应该简单的事情却变成了错综复杂的丑陋。故事是这样的。我下载了很棒的 Box2D,取出了重要的 c++ 文件并添加了 SWIG 的界面。然后,我继续使用 makefile 创建 Swig 包装器

CC=g++
CFLAGS=-c -Wall -fPIC -I../
LDFLAGS=-shared -o box.dll
SOURCES=<OMITTED>

OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=box2d.dll

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

swig:
    swig -csharp -c++ -outdir Wrapper Box2D.i

clean:
    -rm Collision/*.o
    -rm Collision/Shapes/*.o
    -rm Common/*.o
    -rm Dynamics/*.o
    -rm Dynamics/Contacts/*.o
    -rm Dynamics/Joints/*.o
    -rm Rope/*.o

非常正常的东西,并且工作正常(在修复接口(interface)文件中的 %includes 而不是 #includes 之后)。所以我在 cygwin 中“make swig”,没有问题(必须重新排序包含,以便基类排在第一位)。然后我在 VS.NET 2012 中加载它,将所有包装器 .cs 文件复制到解决方案中并将 DLL 移过去。这就是事情变得令人讨厌的地方。

第一次,我相信 x86 和 x64 的混合导致了很大的问题。我可以立即看出这就是问题所在,并且丝毫没有被高度描述性的错误消息所困惑:

System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

在我尝试解决此问题时,大部分谷歌搜索都认为调用约定可能是罪魁祸首,因此我更改了 SWIG 包装器 cpp 文件,将函数作为 __cdecl 而不是 __stdcall 导出到 dll 中,并适当更新了包装器.

无论如何,我最终通过创建一个新的 x86 构建配置文件来修复 x86/x64 混合问题,然后在调用 dll 中的任何函数时,程序就会挂起。所以我决定回归基础,简单地使用 __stdcall 进行编译,没有包装器 mods,然后看看它是否能工作。

事实并非如此。

现在它提示缺少入口点:

{"Unable to find an entry point named 'SWIGRegisterExceptionCallbacks_box2d' in DLL 'box2d'.":""} System.Exception {System.EntryPointNotFoundException}

转储 DLL 的导出后,函数会根据 __stdcall 正确损坏

CSharp_b2_aabbMultiplier_get@0
...
SWIGRegisterStringCallback_box2d@4
SWIGRegisterExceptionCallbacks_box2d@44

等等。等等

现在,C# 包装器端似乎没有发现这是一个问题,并且直接前进并忽略损坏

[DllImport("box2d", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_box2d")]

所以我出于绝望而尝试了这个

[DllImport("box2d", EntryPoint = "SWIGRegisterExceptionCallbacks_box2d", CallingConvention = CallingConvention.StdCall)]

遇到了同样的问题。解决方案?将损坏的名称粘贴进去。

[DllImport("box2d", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_box2d@44")]

...适用于所有 1392 个 DllImport 属性。不是解决方案。

我尝试过使用 minGW 和 Cygwin 来编译 DLL,所以我怀疑 DLL 的编译方式有很大问题。

有人知道我做错了什么吗?

最佳答案

事实证明,C# 无法进入 Cygwin 或 MinGW dll,因此我用 VSC++ 重新编译,一切顺利。

关于c# - SWIG、Box2D 和 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684574/

相关文章:

c# - 现有 Canvas 中的 ItemsControl

c# - 获取位图像素列的最佳且快速的方法是什么?

c++ - 编译时得到错误: 'QtGui/QAction' file not found #include <QtGui/QAction>

java - Box2D 远离行星旋转

java - Box2D 形状未渲染

c# - C#中的"MoveFile"函数(重启后删除文件)

c++ - 退出码3(不是我的返回值,找源码)

c++ - Kinect SDK 2.0 处理和获取深度帧

libgdx - 是否可以为可能被其他物体破坏的物体创建固定装置?

c# - 如何在不实际安装连接器的情况下通过 C# 使用 mysql 连接器连接到 mysql