1

我有以下类,它使用 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 ();

    } 
}

编译器输出如下:

构建解决方案:calling-native-code-mono(调试)

构建:calling-native-code-mono (Debug) 执行主编译... /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 "/定义:调试”/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 目标)[0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load)[0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] 在 :0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono。CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.ExplicitBlock.Emit ( Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在: 0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation 目标的 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation target ) [0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load) [0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec, Boolean is_statement) [0x00000] 在:0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock .Emit (Mono.CSharp.EmitContext ec) [0x00000] in :0 在 Mono.CSharp.Constructor.Emit () [0x00000] in :0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .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] 在:0 在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec,IMemoryLocation 目标)[0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load)[0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] 在 :0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono。CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.ExplicitBlock.Emit ( Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在: 0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation 目标的 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation target ) [0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load) [0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec, Boolean is_statement) [0x00000] 在:0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock .Emit (Mono.CSharp.EmitContext ec) [0x00000] in :0 在 Mono.CSharp.Constructor.Emit () [0x00000] in :0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 构建完成 -- 1 个错误,0 个警告

- - - - - - - - - - - 完毕 - - - - - - - - - - -

构建:1 个错误,0 个警告

4

1 回答 1

5

添加:

using System.Runtime.InteropServices;

在文件的开头修复它,DLLImport位于该名称空间。不知道为什么编译器不只是抱怨它而不是崩溃。

此处填写了错误报告。

于 2012-08-14T16:58:17.130 回答