Mono的TypeLoadException

时间:2014-06-23 22:21:45

标签: c# mono katana

我正在努力让Mono 3.4.0与一些Microsoft OWIN组件一起使用。我已经开始在Windows上进行测试,但是当我的应用程序处理HTTP请求时,我得到以下异常:

  

System.TypeLoadException:无法从程序集“Microsoft.Owin,Version = 2.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”中加载“Microsoft.Owin.Security.AuthenticateResult”类型。

应用程序正在使用Visual Studio作为标准.NET程序集进行编译,期望它应该在Mono运行时上运行。

我将Microsoft.Owin NuGet包添加到控制台应用程序并设法将问题重现为以下代码:

class Program
{
    static void Main(string[] args)
    {
        var instance = new AuthenticateResult(
            null,
            new AuthenticationProperties(),
            new AuthenticationDescription());

        Console.WriteLine(instance.GetType().AssemblyQualifiedName);
    }
}

在.NET中运行,应用程序正常启动并打印出类型信息。如果它通过Mono运行,应用程序将打印出异常并失败。

此外,此代码适用于.NET和Mono:

class Program
{
    static void Main(string[] args)
    {
        var type = typeof(AuthenticateResult);
        Console.WriteLine(type.AssemblyQualifiedName);
    }
}

我已经使用Microsoft.Owin程序集中的许多类型进行了测试,结果相似。如果我在需要之前使用typeof运算符加载类型,Mono不会引发异常,而是尝试加载异常尝试加载不同的类型(可能只是代码所需的下一个)。

为什么我在Mono中运行时会遇到这种奇怪的行为?我是否需要在命令行中指定加载程序集,就像我期望的.NET CLR一样?有什么我可以做的,以获得有关无法加载类型的原因的进一步信息吗?

1 个答案:

答案 0 :(得分:3)

类型加载错误看起来是由您在代码中引用的类型使用的类型之一引起的,而不是您实际使用的类型。

如果在运行程序之前运行set MONO_LOG_LEVEL=debug,您将在输出中看到以下内容:

  

Mono:类System.Security.Claims.ClaimsIdentity不可能   已加载,在mscorlib中使用,版本= 4.0.0.0,文化=中性,   公钥= b77a5c561934e089

mono status page进行检查,我们可以看到System.Security.Claims名称空间中尚未实现Mono。