【问题标题】:System.TypeLoadExceptionSystem.TypeLoadException
【发布时间】:2016-06-26 14:50:37
【问题描述】:

您好,我在 C# 中通过 TCP/IP 套接字进行练习,遇到了一个我不知道如何处理的故障。下面的示例是使用自定义调度程序的客户端。当我尝试加载包含实现的程序集时,会抛出以下异常。

namespace TcpEchoServerThreadFactory
{
    class TcpEchoServerThreadFactory
    {
        static void Main(string[] args)
        {
            if (args.Length != 3)
                throw new ArgumentException("Parameter(s): [optional properties]" + 
                    "<port> <protocol> <dispatcher>");

            int port = Int32.Parse(args[0]);
            string protocolName = args[1];
            string dispatcherName = args[2];

            TcpListener listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
            ILogger logger = new ConsoleLogger();

            System.Runtime.Remoting.ObjectHandle objHandle = Activator.CreateInstance("TcpEchoThreadServerLib", protocolName + "ProtocolFactory");
            IProtocolFactory protocolFactory = (IProtocolFactory)objHandle.Unwrap();
            objHandle = Activator.CreateInstance("TcpEchoThreadServerLib", dispatcherName + "Dispatcher");
            IDispatcher dispatcher = (IDispatcher)objHandle.Unwrap();

            dispatcher.startDispatching(listener, logger, protocolFactory);
        }
    }
}

Unhandled Exception: System.TypeLoadException: Could not load type 'EchoProtocolFactory' from assembly 'TcpEchoThreadServerLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=
null'.
   at System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
   at System.Activator.CreateInstance(String assemblyString, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Ob
ject[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(String assemblyName, String typeName)
   at TcpEchoServerThreadFactory.TcpEchoServerThreadFactory.Main(String[] args) in C:\microsoft_press\DemoProjects\NonBlocking\TcpEchoServerThreadFactory\TcpEchoServerThreadFact
ory.cs:line 25

【问题讨论】:

  • TypeLoadException 是否设置了 InnerException?这通常是在静态构造函数期间引发二次异常的情况。
  • 我从堆中转储了所有异常,只有 TypeLoadException:异常对象:02109900 异常类型:System.TypeLoadException 消息:无法从程序集“TcpEchoThreadServerLib,版本=1.0”加载类型“EchoProtocolFactory” .0.0,Culture=neutral,PublicKeyToken=null'。
  • 查看建议here
  • 它只是告诉你“TcpEchoThreadServerLib”不是一个有效的类型名称。看起来很有可能,它似乎缺少命名空间名称。
  • @HansPassant Thx... 使用命名空间指定类型解决了失败。

标签: c# .net windows visual-studio


【解决方案1】:

按照 Hans Passan 的建议,我使用命名空间对类型进行了限定,现在代码可以按预期工作

  string ns = "TcpEchoThreadServerLibrary.";

            TcpListener listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
            ILogger logger = new ConsoleLogger();

            System.Runtime.Remoting.ObjectHandle objHandle =
                Activator.CreateInstance("TcpEchoThreadServerLib", ns + protocolName + "ProtocolFactory");
            IProtocolFactory protocolFactory = (IProtocolFactory)objHandle.Unwrap();

            objHandle = Activator.CreateInstance("TcpEchoThreadServerLib", ns + dispatcherName + "Dispatcher");
            IDispatcher dispatcher = (IDispatcher)objHandle.Unwrap();

            dispatcher.startDispatching(listener, logger, protocolFactory);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多