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

本文关键字:未处理 异常 messaging system Unity 为什么 | 更新日期: 2023-09-27 18:21:42

我有以下简单代码:

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",版本=2.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'。

位于(包装管理为本机)System.MonoType:GetMethodsByName(字符串,System.Reflection.BindingFlags,布尔,System.Type)

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

在Mono.Sharp.MemberCache.AddMethods(BindingFlags bf,System.Typetype)[0x0000]在:0 中

在Mono.Sharp.MemberCache.AddMethods(System.Type类型)[0x0000]in:0

位于Mono.CSharp.MemberCache.ctor(IMemberContainer容器)[0x0000]在:0 中

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

在中的Mono.Sharp.TypeHandle.GetTypeHandle(System.Type t)[0x0000]处:0

位于Mono.Sharp.TypeHandle.GetMemberCache(System.Type t)[0x0000]in:0

在Mono.Sharp.TypeManager.MemberLookup_FindMembers(System.Type t,MemberTypes mt,BindingFlags bf,System.String name,System.Boolean&used_cache)[0x0000]在:0 中

在Mono.Sharp.TypeManager.RealMemberLookup(System.Typeinvocation_type,System.type qualifier_type,System.type queried_type,MemberTypes mt,BindingFlags original_bf,System.String name,IListalmost_match)[00x00000]在:0 中

在Mono.Sharp.TypeManager.MemberLookup(System.Typeinvocation_type,System.type qualifier_type,System.type queried_type,MemberTypes mt,BindingFlags original_bf,System.String name,IListalmost_match)[00x00000]在:0 中

是什么原因导致了这种情况,我该如何解决?

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

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

其中一种方法应该适用于您:

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

步骤1:在项目的assets文件夹中创建一个"Plugins"文件夹。

步骤2:从它们的文件夹中复制所需的丢失库(.dlls):统一路径''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,而是其中的一个子集。

希望这些能帮助