我在將對象強制轉換爲生活在另一個庫中的其中一個基礎接口時遇到了問題。下面是它的代碼:將對象強制轉換爲基礎接口
BaseSDK.dll
public interface IPlugin
{
void Run();
}
CustomPlugin.Definition.dll:
public interface ICustomPlugin
{
void DoCustomStuff();
}
CustomPlugin.dll(具有參照BaseSDK.dll和CustomPlugin.Definition.dll):
public class CustomPlugin: IPlugin, ICustomPlugin
{
public void Run()
{
}
public void DoCustomStuff()
{
}
}
Host.exe(有BaseSDK.dll和CustomPlugin.Definition.dll引用):
IPlugin plugin;
public void DoStuff()
{
plugin = LoadPluginAndCreateAnInstanceSomehow();
// I know plugin is a CustomPlugin
ICustomPlugin customPlugin = plugin as ICustomPlugin; //cast fails.
customPlugin.DoCustomStuff();
}
我不明白;這只是簡單的將類型轉換爲基本類型。我怎樣才能解決這個問題?或任何替代品?
編輯:這裏是什麼LoadPluginAndCreateAnInstanceSomehow()
做了總結:
Assembly ass = Assembly.LoadFrom(filename);
Type t = ass.GetType(ass.FullName + ".CustomPlugin");
plugin = (IPlugin)Activator.CreateInstance(t);
編輯2:插件加載到另一個AppDomain中。我不得不在編譯時添加IPlugin和ICustomPlugin.Definiton作爲參考,因爲應用程序必須知道CustomPlugin是什麼樣的。這是問題的根源嗎?如果是這樣,我該如何實現我想要做的?
編輯3:插件加載這樣的:
public class PluginLoader
{
List<IPlugin> Plugins;
AppDomain Domain;
string libPath;
public void PluginLoader(string sLibPath, AppDomain sDomain)
{
libPath = sLibPath;
Plugins = new List<IPlugin>();
Domain = sDomain;
if(Domain==null)Domain = AppDomain.CreateDomain("PluginsDomain");
Domain.AssemblyResolve += new ResolveEventHandler(Domain_AssemblyResolve);
Domain.TypeResolve += new ResolveEventHandler(Domain_TypeResolve);
Domain.DoCallBack(new CrossAppDomainDelegate(DomainCallback));
}
Assembly Domain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return Assembly.LoadFrom(args.Name);
}
Assembly Domain_TypeResolve(object sender, ResolveEventArgs args)
{
return Assembly.LoadFrom(args.Name);
}
void DomainCallback()
{
string[] fileNames = Directory.GetFiles(libPath, "*.dll");
foreach (string filename in fileNames)
{
FileInfo fi = new FileInfo(filename);
Assembly ass = Assembly.LoadFrom(fi.FullName);
Type t = ass.GetType(ass.FullName + ".CustomPlugin");
IPlugin p = (IPlugin)Activator.CreateInstance(t);
Plugins.Add(p);
}
}
}
你能告訴我們你是如何加載到另一個AppDomain插件?我已經嘗試過在各種不同地點的DLL,但我不能複製你的問題。 – Sam 2010-08-18 02:19:36
Assembly ass = Assembly.LoadFrom(fi.FullName)。大聲笑在變量名稱。 – obelix 2010-08-18 03:24:15
我很困惑。爲什麼有人預期從不同應用程序域加載的類型將與當前應用程序域中加載的相同類型兼容? – 2010-08-18 03:28:21