【问题标题】:Internal compiler error integrating jabber-net with Unity3d将 jabber-net 与 Unity3d 集成的内部编译器错误
【发布时间】:2012-10-21 12:15:38
【问题描述】:

将 jabber-net dll 从 here 导入我的项目并运行后

using UnityEngine;
using System.Collections;
using jabber;
using jabber.client;
using jabber.connection;

public class XMPP : MonoBehaviour {

    jabber.client.JabberClient jC;

        // Use this for initialization
        void Start () {
        jC = new JabberClient();
    }
}

Unity 抱怨:

内部编译器错误。有关更多信息,请参阅控制台日志。输出是: 未处理的异常:System.TypeLoadException:无法从程序集“jabber-net,Version=2.1.0.710,Culture=neutral,PublicKeyToken=924c5b18328d6f09”加载类型“jabber.connection.XmppStream”。

我读到其他人(极少数人)已经设法将 jabber-net 与他们的 Unity 代码集成。任何人都可以阐明如何做到这一点或将我指向一个替代图书馆吗?我非常希望能够在我的项目中使用 XMPP。

谢谢

编辑

感谢 @Calvin 提供有用的回复并帮助我深入研究问题。

解决步骤:

  1. 剥离 System.Drawing 和 System.Windows.Form 后在 monodevelop 中编译 dll(将构建目标更改为库而不是可执行文件)
  2. 导入 Plugins 文件夹中的 dll(不是随机文件夹)
  3. 将 Unity 构建目标更改为 Net 2.0(不是 Net 2.0 子集)并指示它剥离字节码
  4. 删除 SystemAssemblies 文件夹以强制重新编译

事后分析

而且……这种方法似乎最终会失败。编译到 ios 似乎用 ExecutionEngineException: Attempting to JIT compile method '(wrapper managed-to-native) System.Threading.Interlocked:CompareExchange (jabber.protocol.ProtocolHandler&,jabber.protocol.ProtocolHandler,jabber.protocol. ProtocolHandler)' 使用 --aot-only 运行时。

【问题讨论】:

  • 出于好奇,您使用的是 Mono DLL 吗?我相信 Unity 是基于 Mono 而不是 Microsoft .NET 框架。
  • 是的,我正在使用 Mono DLL。
  • jabber-net 网站没有说明它支持哪些版本的 .Net。您可能需要在 MonoDevelop 中从源代码编译它,看看是否有针对 .Net 2.0 的构建选项。
  • 我使用 gmcs 构建了它,它应该针对 .Net 2.0。这是不正确的吗?

标签: c# xmpp unity3d


【解决方案1】:

我刚刚能够在 MonoDevelop 中编译 2005-jabber-net 解决方案并将其添加到 Unity 3.5.6 项目中,而 Unity 不会生成编译器错误。

该解决方案引用了 Unity 不支持的 System.Drawing 和 System.Windows.Forms。我删除了这些,将编译目标更改为“库”,并将 2005-jabber-net.dll、netlib.Dns.dll 和 zlib.net.dll 复制到 Unity 项目中。

您的示例代码在附加到游戏对象时编译并运行,但我没有进一步测试。

编辑:刚刚意识到这个程序集可能需要 Unity Pro,因为 .Net 套接字访问在 Unity 的免费版本中受到限制。

双重编辑:我收回了这一点,刚刚查看了他们的产品比较表,现在 .Net 套接字在 Unity 的免费版本中列为可用。

【讨论】:

  • 感谢您尝试这个@Calvin。我尝试做同样的事情: 1. 删除 System.Drawing 和 System.Windows.Forms 引用 2. 将目标更改为库 3. 将配置设置为 Release 4. 将要构建的框架设置为 Mono 2.0 当我复制我现在得到的统一项目的 dll 文件:内部编译器错误。有关更多信息,请参阅控制台日志。输出为:未处理的异常:System.TypeLoadException:无法从程序集“xmpp”加载类型“System.Runtime.Versioning.TargetFrameworkAttribute”。有什么想法吗?
  • 另外,我应该提一下,我实际上使用的是 Unity Pro 许可证。
  • 我想我找到了问题所在。 jabber dll 需要位于 Unity 项目中的 Plugins 文件夹下(Assets/Plugins/jabber/*.dll。这会改变编译顺序,但我不知道为什么会修复它。
  • 刚刚根据您的建议尝试了这个。同样的错误。作为一个愚蠢的健全性检查,你的 dll 的大小是多少?我的 2005-jabber-net.dll 文件是 612352 字节。
  • 这是我的发布 dll:box.com/s/0vmv8kl63j28kaywrxdc 另外,我正在 OSX 上编译和运行,我的系统安装的单声道版本是 2.10.9。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多