0

如果我能提供帮助,我想创建一个可以在课堂上其他地方使用的对象的实例,而无需进行更多反思。

创建对象后(通过 activator 或constructorInfo,我已经阅读了两者的参数,但使用了 activator 作为它的更短例如)我必须转换它,但这不起作用。

例如:

Server instance;

public void A()
{
    Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll");
    serverType = loaded.GetType("Server");
    object obj = Activator.CreateInstance(serverType, new [] { "test" });
    instance = (Server)obj;
}

public void B()
{
    instance.startServer();
}

这给出了一个例外:

    System.InvalidCastException: [A]Server cannot be cast to [B]Server. 
    Type A originates from 'Shared, Version=0.0.0.0, Culture=neutral,      
    PublicKeyToken=2a032d22a4688508' in the context 
    'LoadFrom' at location 'C:\Program Files\test1\Shared.dll'. 
    Type B originates from 'Shared, Version=0.0.0.0, Culture=neutral,
    PublicKeyToken=2a032d22a4688508' in the context 'Default' at location .
    'C:\Program Files\test2\Shared.dll'

我了解引发异常的原因,但是有没有办法将实例转换为我想要的类型的服务器,即动态加载的 dll?

4

1 回答 1

0

在这一行: instance = (Server)obj;您需要指定类型 Server 的完全限定名称

在您运行此代码的程序集中,可能存在另一种类型Server,因此编译器尝试通过选择本地的来解决这种歧义。您需要指定要转换Server为程序集类test.dll或任何其他特定的类,例如:NAMESPACE.TYPE_NAME

于 2013-07-22T14:09:18.377 回答