SWIG包装现有DLL

时间:2019-07-09 15:27:04

标签: c# windows dll pinvoke swig

我有一个现有的dll(使用MinGW用C构建编写),并且了解其内容(函数名称,参数,返回类型等)。我想使用SWIG通过C#调用dll。作为试用版,我尝试了http://swig.org/tutorial.html

中的教学示例的以下步骤

我将example.c转换为如下所示的dll:

gcc -shared -m32 example.c -o mainDLL.dll

这创建了mainDLL.dll。然后,我在example.i上运行SWIG:

swig.exe -csharp example.i

这将创建C#文件和example_wrap.c文件。 PINVOKE希望在名为example.dll的dll上调用所有SWIG函数。因此,我使用SWIG包装器和mainDLL.dll创建了它:

gcc -shared -m32 example_wrap.c mainDLL.dll -o example.dll
Info: resolving _My_variable by linking to __imp__My_variable (auto-import)

然后,我将这两个dll放入可执行文件的文件夹(bin \ x86 \ Debug)中。然后我尝试通过C#调用dll的内容,但出现错误:

Unhandled Exception: System.TypeInitializationException:
    The type initializer for 'examplePINVOKE' threw an exception. ---> 
System.TypeInitializationException:
    The type initializer for 'SWIGExceptionHelper' threw an exception. ---> 
System.EntryPointNotFoundException: 
    Unable to find an entry point named 'SWIGRegisterExceptionCallbacks_example' in DLL 'example'.

我使用了依赖遍历器来确保SWIGRegisterExceptionCallbacks_example存在于example.dll中。有谁知道如何将SWIG与现有DLL一起使用?

0 个答案:

没有答案