使用VisualStudio -P Indoke构建C DLL

Build C++ DLL with VisualStudio - PInvoke on Linux

本文关键字:DLL 构建 Indoke VisualStudio 使用      更新时间:2023-10-16

这是我要实现的目标:在Visual Studio上构建本机C DLL库,并通过C#应用程序通过Pinvoke在Ubuntu Linux Mono上调用其'方法。简化的代码:

[DllImport("MyLib")]
static extern int MyFunction();
static void Main(string[] args)
{
  int result = MyFunction();
}

在窗户上它的工作方式就像魅力。我在单声道上运行此示例应用程序,但是我有错误:DllNotFoundException。当我启用单声道调试(MONO_LOG_LEVEL="debug" mono MyApp.exe)时,我可以看到找到此DLL,但由于错误而无法加载:"无效的Elf Header"。我想必须用一些特殊标志对DLL进行编译,因此Linux可以识别它。如何做?

由Visual Studio Targets Windows提供的C 编译器。您正在尝试在Linux上执行代码,因此您需要使用针对Linux的编译器编译代码。您只是无法在Linux上本地执行Windows DLL。

您的解决方案是将源代码带到Linux C 编译器和编译器linux共享对象库。

这是行不通的。非托管库是特定于您正在运行的平台的特定库,因此在Linux上使用Mono,您的非管理库必须是.so

根据单声道文档,您必须将 DllImport链接到X,而单声道应进行名称翻译。

例如:

[DllImport("X")]
static extern int MyFunction();

此行应针对Windows上的X.dll链接,Linux上的libX.so和Mac OS X上的X.dylib和CC_8链接。>

请注意,即使您在本地进行编译,它使用本机API(例如Win32 API),它也不会在其他平台上编译。您必须使用跨平台开发工具,库和模式来解决这些问题。