C# 从被调用的对象调用方法
我想创建一个对象的实例,如果可以的话,我可以在我的类的其他地方使用它,而不需要经过更多的反射 创建对象后(通过activator或constructorInfo,我已经阅读了两者的参数,但使用activator作为其缩写),我必须强制转换它,但这不起作用 例如:C# 从被调用的对象调用方法,c#,C#,我想创建一个对象的实例,如果可以的话,我可以在我的类的其他地方使用它,而不需要经过更多的反射 创建对象后(通过activator或constructorInfo,我已经阅读了两者的参数,但使用activator作为其缩写),我必须强制转换它,但这不起作用 例如: Server instance; public void A() { Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll");
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)将实例强制转换为服务器?在这一行:
instance=(Server)obj代码>您需要指定类型服务器的完全限定名称
在运行此代码的程序集中,可能存在另一种类型的服务器
,因此编译器尝试通过选择本地类型来解决这种歧义。您需要指定,您将强制转换到test.dll的Server
类或任何其他特定类,例如:名称空间。在我的情况下,键入\u NAME
,它们具有相同的名称空间,因为它们实际上是完全相同的类,并且在完全相同的程序集中,只是在不同的位置。我需要在另一个位置使用dll,因为在那里我使用程序集的路径来获取启动另一个exe的路径。“不同位置”代表什么?我的意思是相同的dll位于两个不同的位置。我正在为另一个应用程序创建一些插件,它们共享一些程序集。不同的位置:表示不同的名称空间(I immagine)=>指定确切的名称空间。如果加载具有相同类型的多个程序集,则类型不兼容。相反,您应该将其强制转换到在所有插件之间共享的公共dll中定义一次的接口,而不是为每个插件重复。您的代码中的Server
与test.dll中的“Server”不同吗?或者两者都指向同一类型?很抱歉,我试图缩短代码,编辑以删除test.dll,现在尝试从正确的位置加载。我想您不理解我的问题。代码中的服务器是否与Shared.dll中的“Server”不同?或者两者都指向同一类型?服务器仅存在于Shared.dll程序集中。当加载同一程序集两次时,您会看到什么不同?两者都指向同一类服务器。?