Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从被调用的对象调用方法_C# - Fatal编程技术网

C# 从被调用的对象调用方法

C# 从被调用的对象调用方法,c#,C#,我想创建一个对象的实例,如果可以的话,我可以在我的类的其他地方使用它,而不需要经过更多的反射 创建对象后(通过activator或constructorInfo,我已经阅读了两者的参数,但使用activator作为其缩写),我必须强制转换它,但这不起作用 例如: Server instance; public void A() { Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll");

我想创建一个对象的实例,如果可以的话,我可以在我的类的其他地方使用它,而不需要经过更多的反射

创建对象后(通过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)将实例强制转换为服务器?

在这一行:
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程序集中。当加载同一程序集两次时,您会看到什么不同?两者都指向同一类
服务器
。?