本来应该简单的事情却变成了错综复杂的丑陋。故事是这样的。我下载了很棒的 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/