单声道互操作:加载 32 位共享库在我的 64 位系统上不起作用

Mono interop: Loading 32bit shared library does not work on my 64bit system(单声道互操作:加载 32 位共享库在我的 64 位系统上不起作用)
本文介绍了单声道互操作:加载 32 位共享库在我的 64 位系统上不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的系统上运行一个简单的互操作示例时遇到问题.我构建了一个简单的 32 位共享库,名为 libtest.so (c++)

i have a problem running a simple interop example on my system. I built a simple 32-bit shared library called libtest.so (c++)

g++ -c -fpic test.cpp -m32
g++ -shared -fpic -o libtest.so test.o -m32

我的系统:Ubuntu Linux 10.04 x86_64

My System: Ubuntu Linux 10.04 x86_64

Mono C# 编译器版本 2.4.4.0

Mono C# compiler version 2.4.4.0

此外,我还有一个使用我的共享库的示例 c# 程序:

In addition i have a sample c# program using my shared library:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

public class Test
{
        [DllImport("libdl.so")] 
        static extern IntPtr dlopen(string filename, int flags); 

        [DllImport("libdl.so")] 
        static extern IntPtr dlclose(IntPtr handle);

        [DllImport ("./libtest.so")]
        private static extern void HelloWorld();

        [DllImport ("./libtest.so",EntryPoint="Test")]
        private static extern int Testl(int a,int b); 

        public static int Main(string[] args)
        {   
                IntPtr handle = dlopen("./libtest.so",2);
                if(handle == IntPtr.Zero)
                {   
                       Console.WriteLine("Error loading shared library");
                        return -1; 
                }   

                HelloWorld();
                int ret = Testl(116,1);
                Console.WriteLine("Result from shared-Librarry Call: " + ret);

                dlclose(handle);
                return 0;
        }   
}

问题:加载库不起作用.

The Problem: Loading the library does not work.

导出 MONO_LOG_LEVEL=debug 给我以下提示:Mono-INFO: DllImport error loading library './libtest.so: Wrong ELF-Class: ELFCLASS32'.

exporting MONO_LOG_LEVEL=debug gives me the following hint: Mono-INFO: DllImport error loading library './libtest.so: Wrong ELF-Class: ELFCLASS32'.

好吧,我猜 mono 在 64 位模式下运行我的程序,因此它不能调用 32 位共享库?如果我以 64 位模式(没有 -m32)构建共享库,一切正常!!

Well i guess mono runs my program in 64-bit mode and therefore it cannot call a 32-bit shared library? If i build the shared library in 64 bit mode (without -m32) everything works fine!!

我的 Mono-Compiler 2.4.4.没有使用/platform:x86 指定平台的选项,因此我安装了 2.10 版,但使用它也不起作用.

My Mono-Compiler 2.4.4. does not have the option to specify the platform with /platform:x86 and therefore i installed version 2.10, but using it does not work either.

/opt/mono-2.10/bin/gmcs /platform:x86 sharpCall.cs

是否有可能在 64 位系统上加载 32 位共享库?

Is there a possibility to load 32-bit shared libraries on a 64-bit system?

推荐答案

问题是您的系统上安装了 64 位版本的 Mono,它只能 P/Invoke 到 64 位本机库,它不能 P/Invoke 到 32 位本机库中.

The problem is that you have a 64bit version of Mono installed on your system which can only P/Invoke into 64bit native libraries, it cannot P/Invoke into 32bit native libraries.

-platform:x86 标志用于 C#编译器,而不是运行时,并且不提示运行时使用 32 位内存空间.

The -platform:x86 flag is meant for the C# compiler, not the runtime, and does not hint to the runtime to use a 32bit memory space.

如果你想 P/Invoke 到 32 位原生库,你需要在你的 Ubuntu 系统上安装 32 位版本的 Mono.

You need to install the 32bit version of Mono on your Ubuntu system if you want to P/Invoke into 32bit native libraries.

这篇关于单声道互操作:加载 32 位共享库在我的 64 位系统上不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)