2016-04-22 38 views
0

我有2個dll,一個帶有一個接口,另一個實際使用接口。 我可以使用反射調用第二個dll,但我想知道是否可以使用該接口獲取有關它的更多信息。通過動態裝配加載獲取派生類?

我有類似...

​​

,並在同一個DLL另一個接口...
需要注意的是從第一個的。

namespace Mynamespace{ 
    public interface Interface2 : Interface1 
    { 
    int Sub(int a, int b); 
    } 
} 

我然後使用反射

// get the 2 interfaces 
var asm = Assembly.LoadFile(dllInterfacePath); 
var type1 = asm.GetType("Mynamespace.Interface1"); 
var type2 = asm.GetType("Mynamespace.Interface2"); 

// get the main class 
var asmDll = Assembly.LoadFile(dllPath); 
var type = asmDll.GetType("MyMS.SomeClass"); 

// create an instance 
var instance = Activator.CreateInstance(type, null); 

現在我的問題是我怎麼能告訴我們,如果創建的實例衍生關閉Interface2Interface1,我可以尋找方法「子(調用方法.. 。「),如果它不存在,那麼我知道它是Interface1

但我想知道是否有更好的功能來動態實現這一目標?

我不能使用

typeof(Interface1).IsAssignableFrom(typeof(MyMS.SomeClass)); 

既是Interface1MyMS.SomeClass是動態加載,並在項目未引用。

+0

@ wiktor-zychla,我已經編輯它來澄清爲什麼這不是重複的。 – FFMG

+1

您不必使用'typeof'來獲取類型引用。 api也適用於動態加載的類型。 –

+0

對不起,但它不起作用。 ''typeof(Interface1).IsAssignableFrom(typeof(MyMS.SomeClass));''或''type.IsAssignableFrom(type1);''不起作用 – FFMG

回答

3

您不必使用typeof來獲得類型引用,反射API也適用於動態加載的類型。

對不起,但它不起作用。 typeof運算(接口1).IsAssignableFrom(typeof運算(MyMS.SomeClass));或type.IsAssignableFrom(type1);不工作

它的工作,但通過調用LoadFile你基本上是在加載相同的接口組件的兩倍,因此,根本不可能來指代相同的接口類型上實現它的類:

https://blogs.msdn.microsoft.com/suzcook/2003/09/19/loadfile-vs-loadfrom/

只需更換LoadFileLoadFrom甚至ReflectionOnlyLoadFrom

我剛剛重新您的情況,我有一個組裝與INT erface和另一個實現的程序集。

Assembly interfaceLib  = Assembly.ReflectionOnlyLoadFrom("InterfaceLib.dll"); 
Assembly implementationLib = Assembly.ReflectionOnlyLoadFrom("ImplementationLib.dll"); 

var i = interfaceLib.GetType("InterfaceLib.Interface1"); 
var t = implementationLib.GetType("ImplementationLib.Class1"); 

var b = i.IsAssignableFrom(t); 

Console.WriteLine(b); 

// prints "true" 

如果我切換到LoadFile我得到false

+0

「LoadFile」與「LoadFrom」是問題,如果你沒有在尋找它,那麼這兩者之間的細微差別(然而重要的)並不明顯。 – FFMG