为什么在Unity中使用system.messaging会导致未处理的异常?

时间:2013-07-08 16:09:28

标签: c# mono unity3d system.messaging

我有以下简单的代码:

using UnityEngine; 
using System; 
using System.Messaging; 
using System.IO; 
using RabbitMQ; 
using Mono.Messaging; 
using Mono.Messaging.RabbitMQ; 

namespace NB.src.ui { 

    public class NBMessage {     

        public void Init() { 
            Message msg = new Message();//build pass  
            if(!MessageQueue.Exists(".\\myQueue"))//error 
            {  
                MessageQueue.Create(".\\myQueue"); 
            } 
        }

我收到以下错误:

  

未处理的异常:System.TypeLoadException:无法加载类型   来自程序集'System.Messaging的'System.Messaging.MessageQueue',   Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。

     

at(wrapper managed-to-native)System.MonoType:GetMethodsByName   (字符串,System.Reflection.BindingFlags,布尔,System.Type的)

     

在System.MonoType.GetMethods(BindingFlags bindingAttr)[0x00000]   in:0

     

at Mono.CSharp.MemberCache.AddMethods(BindingFlags bf,System.Type   type)[0x00000] in:0

     

at Mono.CSharp.MemberCache.AddMethods(System.Type type)[0x00000]   in:0

     

在Mono.CSharp.MemberCache..ctor(IMemberContainer容器)   [0x00000] in:0

     

在Mono.CSharp.TypeHandle..ctor(System.Type类型)[0x00000]中   :0

     

at Mono.CSharp.TypeHandle.GetTypeHandle(System.Type t)[0x00000] in   :0

     

at Mono.CSharp.TypeHandle.GetMemberCache(System.Type t)[0x00000]   in:0

     

at Mono.CSharp.TypeManager.MemberLookup_FindMembers(System.Type t,   MemberTypes mt,BindingFlags bf,System.String name,System.Boolean&   used_cache)[0x00000] in:0

     

at Mono.CSharp.TypeManager.RealMemberLookup(System.Type   invocation_type,System.Type qualifier_type,System.Type queried_type,   MemberTypes mt,BindingFlags original_bf,System.String name,IList   almost_match)[0x00000] in:0

     

at Mono.CSharp.TypeManager.MemberLookup(System.Type   invocation_type,System.Type qualifier_type,System.Type queried_type,   MemberTypes mt,BindingFlags original_bf,System.String name,IList   almost_match)[0x00000] in:0

可能导致此问题的原因以及如何解决?

1 个答案:

答案 0 :(得分:1)

Unity不与Mono共享资源,因此即使Mono可以访问库,也不意味着Unity也可以访问它。 Unity努力使您的项目尽可能轻松,因此您需要手动将所需的dll添加到项目中。

其中一种方式适合您:

方式1: 将特定库添加到Unity3d项目

步骤1:在项目的assets文件夹中创建“Plugins”文件夹。

步骤2:从其文件夹中复制所需的缺失库(.dll): 统一路径\ Unity \ Editor \ Data \ MonoBleedingEdge \ lib \ mono \ 2.0 到您在步骤1中创建的文件夹

*另请注意,通过这种方式可以添加一些.NET 3.5及更高版本的功能(我已经成功使用了System.Xml.Linq.dll和System.Linq.dll)

方式2: 将更大的Mono支持的2.0库子集添加到Unity:

我不确定这是否适用于您提到的特定图书馆,但为了完整起见我已添加它

步骤1:菜单>编辑>项目设置>播放器

步骤2:在显示的检查器窗口中打开“其他设置”

步骤3:在“优化”标签下,将“Api兼容级别”从“.NET 2.0子集”更改为“.NET 2.0”

*请注意,这仍然不支持所有Mono 2.0 - 但是更大的一部分。

希望这些帮助