Mau*_*res 1 c# macos mono interop cfrunloop
我有以下类使用Mono(在mac中)将一些运行循环调用从本机代码映射到C#,并且编译器不起作用,它在尝试编译时一直崩溃.我已将其删除到仅包含此类的单独项目,但它仍然已损坏,因此看起来问题是具体使用此代码.
有没有人见过这样的东西?
using System;
using System.Threading;
namespace Integration.Mac
{
public class CommonRunLoop
{
static IntPtr runLoopReference;
public static IntPtr CommonRunLoopReference {
get {
return runLoopReference;
}
}
static CommonRunLoop() {
AutoResetEvent lockObj = new AutoResetEvent (true);
Thread runLoop = new Thread (delegate() {
runLoopReference = CFRunLoopGetCurrent ();
lockObj.Set ();
CFRunLoopRun ();
});
runLoop.IsBackground = true;
runLoop.Name = "Common-Sync-Run-Loop";
lockObj.WaitOne();
}
[DllImport ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
extern static IntPtr CFRunLoopGetCurrent ();
[DllImport ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
extern static IntPtr CFRunLoopGetMain ();
[DllImport ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
extern static void CFRunLoopRun ();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器输出如下:
构建解决方案:调用native-code-mono(调试)
构建:调用本机代码单声道(调试)执行主编译... /Library/Frameworks/Mono.framework/Versions/2.10.9/bin/dmcs/noconfig"/ out:/ Users/mauricio/Projects/calling -native-code-mono/bin/Debug/calling-native-code-mono.dll""/ r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.dll" "/r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Core.dll"/ nologo/warn:4/debug:full/optimize-/codepage:utf8"/ define:DEBUG"/ t:library"/Users/mauricio/Projects/calling-native-code-mono/CommonRunLoop.cs""/Users/mauricio/Projects/calling-native-code-mono/AssemblyInfo.cs"
未处理的异常:System.NullReferenceException:对象引用未设置为Mono.CSharp.EmitContext.Emit(OpCode操作码,Mono.CSharp.MethodSpec方法)[0x00000]中的对象实例:0:Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec,IMemoryLocation target)[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression source,Boolean leave_copy,Boolean prepare_for_load)[0x00000] in :0:Mono.CSharp.Assign.Emit(Mono.CSharp.EmitContext ec,Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block. DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp. EmitCont ext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0
at Mono. CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono.CSharp. Driver.Compile()[0x00000] in:0在Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0 [错误]致命不处理异常:System.NullReferenceException:对象引用未设置为Mono.CSharp.EmitContext.Emit中的对象实例(OpCode操作码,Mono.CSharp.MethodSpec方法)[0x00000] in:0 at Mono.CSharp.New.Emit(Mono.CSharp.EmitContext ec,IMemoryLocation target)[0x00000 ] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression source,Boolean leave_copy,Boolean prepare_for_load)[0x00000] in:0 at Mono.CSharp.Assign.Emit(Mono. CSharp.EmitContext ec,Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono. CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit( Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec )[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[ 0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono.CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [ ] args)[0x00000] in:0未处理的异常:System.NullReferenceException:对象引用未设置为Mono.CSharp.EmitContext.Emit(OpCode操作码,Mono.CSharp.MethodSpec方法)[0x00000]中的对象实例:0:Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec,IMemoryLocation target)[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression source,Boolean leave_copy,Boolean prepare_for_load)[0x00000] in :0:Mono.CSharp.Assign.Emit(Mono.CSharp.EmitContext ec,Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block. DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp. EmitCont ext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0
at Mono. CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono.CSharp. Driver.Compile()[0x00000] in:0在Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0 [错误]致命不处理异常:System.NullReferenceException:对象引用未设置为Mono.CSharp.EmitContext.Emit中的对象实例(OpCode操作码,Mono.CSharp.MethodSpec方法)[0x00000] in:0 at Mono.CSharp.New.Emit(Mono.CSharp.EmitContext ec,IMemoryLocation target)[0x00000 ] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression source,Boolean leave_copy,Boolean prepare_for_load)[0x00000] in:0 at Mono.CSharp.Assign.Emit(Mono. CSharp.EmitContext ec,Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono. CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit( Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec )[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[ 0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono.CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [ ] args)[0x00000] in:0构建完成 - 1个错误,0个警告----------------------完成----------------------
构建:1个错误,0个警告
添加:
using System.Runtime.InteropServices;
Run Code Online (Sandbox Code Playgroud)
在文件的开头修复它,DLLImport就在那个命名空间.不知道为什么编译器不只是抱怨它而不是崩溃.
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |