我有動態加載的程序集並將其轉換爲接口的問題。我的錯誤在哪裏?從動態加載程序集創建對象並將其轉換爲接口(.NET 2.0)
主應用程序(負載插件):
namespace Console_IFce_Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press any key to find IPlugin library...");
Console.ReadKey();
string[] files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll");
Console.WriteLine("Loading assembly: {0}", Path.GetFileName(files[0]));
Assembly asm = Assembly.LoadFrom(files[0]);
//Trying this, but still have problems
//Assembly asm = Assembly.Load(File.ReadAllBytes(files[0]));
foreach (Type t in asm.GetTypes())
{
Console.WriteLine("Searching in type {0}... ", t.FullName);
foreach (Type iface in t.GetInterfaces())
{
Console.WriteLine("Interface found: {0}", iface.FullName);
}
if (t is IPlugin)
{
Console.WriteLine("1 - IPlugin found!");
IPlugin plugin = (IPlugin)Activator.CreateInstance(t);
return;
}
if (typeof(IPlugin).IsAssignableFrom(t))
{
Console.WriteLine("2 - IPlugin found!");
IPlugin plugin = (IPlugin)Activator.CreateInstance(t);
return;
}
}
Console.WriteLine("All operations done! Press any key to exit...");
Console.ReadKey();
}
}
}
接口:
namespace Console_IFce_Test
{
interface IPlugin
{
int GetZero();
}
}
而且插件:
namespace Library
{
public class Plugin : Console_IFce_Test.IPlugin
{
public int GetZero()
{
return 0;
}
}
}
在以.exe目錄 - 只有1的.dll(插件) 。因此,它的輸出:
Press any key to find IPlugin library...
Loading assembly: Library.dll
Searching in type Console_IFce_Test.IPlugin...
Searching in type Library.Plugin...
Interface found: Console_IFce_Test.IPlugin
All operations done! Press any key to exit...
你看,該程序發現IPlugin接口組件,但是當我試圖把它與接口比較(二條件語句) - 他們返回false。如果我試圖手動投它 - 它會返回異常「不能投」。
我發現類似的問題:Two Types not equal that should be和答案寫作者:
由不同的應用程序域[.NET]或類加載的同一類/類型 裝載機【JAVA]不會比相等,並且不可直接分配給 彼此。
但我不明白我該怎麼辦?如何?
最好的辦法是創建* *只是在接口類型第3集。由主機和插件引用。這可以確保您在多個裝配中不會有相同的類型。 –
我試試。沒有結果。我感覺,我犯了非常愚蠢的錯誤,但我無法理解 - 在哪裏? – DeniDoman