Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用Mono exe找不到libc_C#_.net_C_Mono - Fatal编程技术网

C# 从C调用Mono exe找不到libc

C# 从C调用Mono exe找不到libc,c#,.net,c,mono,C#,.net,C,Mono,在Ubuntu中,我使用MonoV3.2.8和嵌入式Mono运行时从C调用C可执行文件。当我从命令行(即mono testFile.exe)调用exe.NET 4.5时,它工作正常。但是,当我运行C测试程序时,它会抛出一个C异常: libc at at (wrapper managed-to-native) System.Platform:uname (intptr) at System.Platform.get_IsMacOS () [0x00000] in <filename

在Ubuntu中,我使用MonoV3.2.8和嵌入式Mono运行时从C调用C可执行文件。当我从命令行(即mono testFile.exe)调用exe.NET 4.5时,它工作正常。但是,当我运行C测试程序时,它会抛出一个C异常:

libc at   at (wrapper managed-to-native) System.Platform:uname (intptr)
  at System.Platform.get_IsMacOS () [0x00000] in <filename unknown>:0
  at System.Net.WebRequest.GetSystemWebProxy () [0x00000] in <filename unknown>:0
  at System.Net.WebRequest.GetDefaultWebProxy () [0x00000] in <filename unknown>:0
  at System.Net.WebRequest.get_DefaultWebProxy () [0x00000] in <filename unknown>:0
  at System.Net.GlobalProxySelection.get_Select () [0x00000] in <filename unknown>:0
  at System.Net.HttpWebRequest..ctor (System.Uri uri) [0x00000] in <filename unknown>:0
  at (wrapper remoting-invoke-with-check) System.Net.HttpWebRequest:.ctor (System.Uri)
  at System.Net.HttpRequestCreator.Create (System.Uri uri) [0x00000] in <filename unknown>:0
  at System.Net.WebRequest.Create (System.Uri requestUri) [0x00000] in <filename unknown>:0
  at System.Net.WebRequest.Create (System.String requestUriString) [0x00000] in <filename unknown>:0
  at MyClass.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0
查看调用堆栈和mono源代码,我认为失败与调用libc中的本机“uname”函数有关。因此,CheckOS函数,mcs/class/System/System/Platform.cs的第50行:

if (uname (buf) == 0) {
我认为发生的情况是p/Invoke层无法定位libc.so。然而,当我在我的可执行文件的主函数中进行相同的调用时,它执行得很好,我不明白为什么它在一个地方工作而在另一个地方不工作。同样奇怪的是,异常消息不是DllNotFoundException,而是这个通用的libc消息,尽管我已经确认,当我尝试使用伪p/Invoke时,会收到相同的消息

我的C代码:

int main(int argc,const char* argv[]) {
    MonoDomain* domain=mono_jit_init("testFile.exe");
    MonoAssembly* assembly=mono_domain_assembly_open(domain,"testFile.exe");
    MonoImage* image=mono_assembly_get_image(assembly);

    const char* args[1];
    args[0]="testFile.exe";
    mono_jit_exec(domain,assembly,1,(char**) args);
}
namespace MyClass {
    class MainClass {
        public static void Main (string[] args) {
            WebRequest request=WebRequest.Create("http://www.google.com");
        }
    }
}
我的C代码:

int main(int argc,const char* argv[]) {
    MonoDomain* domain=mono_jit_init("testFile.exe");
    MonoAssembly* assembly=mono_domain_assembly_open(domain,"testFile.exe");
    MonoImage* image=mono_assembly_get_image(assembly);

    const char* args[1];
    args[0]="testFile.exe";
    mono_jit_exec(domain,assembly,1,(char**) args);
}
namespace MyClass {
    class MainClass {
        public static void Main (string[] args) {
            WebRequest request=WebRequest.Create("http://www.google.com");
        }
    }
}
gcc编译选项包括:

gcc cTest.c -I/usr/include/mono-2.0 -DREENTRANT -lmono-2.0 -lm -lrt -ldl -lpthread
dmcs -out:testFile.exe -platform:anycpu -sdk:4.5 -target:exe -unsafe+ -main:MyClass.MainClass -reference:System,System.Configuration,System.Data,System.ServiceModel,System.Web,System.Xml *.cs
mono编译选项包括:

gcc cTest.c -I/usr/include/mono-2.0 -DREENTRANT -lmono-2.0 -lm -lrt -ldl -lpthread
dmcs -out:testFile.exe -platform:anycpu -sdk:4.5 -target:exe -unsafe+ -main:MyClass.MainClass -reference:System,System.Configuration,System.Data,System.ServiceModel,System.Web,System.Xml *.cs
更新:
我使用MONO_LOG_LEVEL和MONO_LOG_MASK跟踪.so搜索序列,发现成功调用的序列与失败调用的序列完全不同。所以它在寻找,只是不是很好。然后我将libc.so.6复制到当前目录,重命名为libc.so,然后将LD_LIBRARY_PATH设置到相同的位置。这给了我成功。我现在让我的Linux专家研究如何使这个解决方案更“正确”,但至少我有一个正在运行的程序。虽然解决方案不适用于我,但可能与我的问题相同。

问题是您缺少dll映射mono\u config\u parse。以下内容将用于Mono3.x和4.x嵌入,并避免您的libc错误

#include <mono/jit/jit.h>
#include <mono/metadata/environment.h>
#include <stdlib.h>

int 
main(int argc, char* argv[]) {
    MonoDomain *domain;
    const char *file;
    int retval;

    mono_config_parse (NULL);
    domain = mono_jit_init ("textFile.exe");
    MonoAssembly *assembly;
    assembly = mono_domain_assembly_open (domain, "testFile.exe");
    mono_jit_exec (domain, assembly, argc, argv);
    retval = mono_environment_exitcode_get ();      
    mono_jit_cleanup (domain);
    return retval;
}
它将加载Mono配置文件,通常为/etc/Mono/config

仅供参考:在Ubuntu 15.04上,我正在使用:

gcc main.c `pkg-config --cflags --libs mono-2`
当然,你可以更新它来获得mono sgen vs.boehm jit

在OS-X上:

gcc main.c -m32 -framework Foundation -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk \
 -lmonosgen-2.0 \
 -I/Library/Frameworks/Mono.framework/Headers/mono-2.0 \
 -L/Library/Frameworks/Mono.framework/Libraries

根据您的更新,应用程序似乎正在搜索libc.so而不是libc.so.6。通过手动将LD_LIBRARY_路径指向包含libc的当前文件夹,您可以复制它


建议:让您的Linux专家在您的正常搜索路径中将libc.so符号链接到libc.so.6,以使您的应用程序正常工作。

我也遇到了这个问题。我注意到的是,mkbundle输出列出了它嵌入的程序集,并且没有包括System.Net.dll。在mkbundle命令行上手动添加它之后,一切正常

我现在使用的命令行:

mkbundle my.exe --deps --keeptemp --static --config /etc/mono/configlibc --machine-config /etc/mono/4.5/machine.config System.Net.dll -o bssetup.exe
configlibc文件是该目录中默认配置文件的修改副本。修改的目的是删除除libc之外的所有映射线


希望它能帮助任何人

您是否尝试在没有.so扩展名的情况下PInvoke libc?我记得mono会根据平台添加正确的扩展,如果您自己提供扩展,有时会感到困惑。platform.cs代码没有.so扩展。我很惊讶它在我自己的一个p/调用DLL调用中做得这么好,我实际上忘记了剥离.DLL。你的c代码的gcc编译选项是什么?问题是……你有没有尝试过绑定DMC的字节码输出?我尝试过添加mono_config_parse,call;得到了同样的结果。我怀疑它正在读取DllMappings,因为我在测试中故意使用了一些错误的映射,它确实使用了它们。奇怪的是,如果我不使用内置配置或我自己的配置初始化mono的配置,我在U-15.04和OS-X 32和64位上的uname失败时会得到相同的堆栈跟踪…这应该是一种方法。它比符号链接libc.so更合适。