我們正在測試MAF插件用作我們的插件框架。但是我們陷入了一個基本問題。我們可以使用可序列化的類型作爲IContract參數嗎?MAF(System.Addin)屬性中的可序列化類型?
無論是合同,參數類型是在同一程序中定義:
public interface IHostContract : IContract
{
void SetCurrent(TheValue tagValue); // does not work
void SetCurrentSimple(double value); // works fine
}
[Serializable]
public sealed class TheValue
{
public int Id { get; set; }
public double Value { get; set; }
}
我們能夠得到的一切啓動和運行。在調用異常的setCurrent結果: AppDomainUnloadedException:
The application domain in which the thread was running has been unloaded.
Server stack trace:
at System.Threading.Thread.InternalCrossContextCallback(Context ctx, IntPtr ctxID, Int32 appDomainID, InternalCrossContextDelegate ftnToCall, Object[] args)
at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)
Exception rethrown at [0]:
加載和運行的插件:
public void Run(string PluginFolder)
{
AddInStore.Rebuild(PluginFolder);
Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(Plugins.IPlugin), PluginFolder);
foreach (var token in tokens)
{
Console.WriteLine("Found addin: " + token.Name + " v" + token.Version);
try
{
var plugin = token.Activate<Plugins.IPlugin>(AddInSecurityLevel.FullTrust);
plugin.PluginHost = this;
plugin.Start();
plugin.Stop();
}
catch (Exception exception)
{
Console.WriteLine("Error starting plugin: " + exception.Message);
}
}
}
插件:
[System.AddIn.AddIn("Plugin1", Version = "1.0.0")]
public class Plugin1 : IPlugin
{
private int started;
public Plugin1()
{
Console.WriteLine("Plugin 1 created");
}
public void Start()
{
Console.WriteLine("Plugin 1 started: {0}", started);
started++;
var tagValue = new TheValue { Id = 1, Value = 4.32 };
PluginHost.SetCurrent(tagValue);
}
public void Stop()
{
Console.WriteLine("Plugin 1 stopped");
}
public IPluginHost PluginHost { get; set; }
}
您應仔細閱讀由負責System.AddIn http://blogs.msdn.com/b/clraddins/archive/2007/02/27/restrictions-on-contracts團隊中的一員以下博客條目。 aspx TheValue應該是合約程序集中的一個結構體。順便說一句我已經使用System.AddIn廣泛的幾年,我不會推薦它除了主機暴露在加載項(如Visual Studio,微軟Office等)。如果你想創建一個更復雜的設計,使用配合或樂高設計的插件,那麼MEF或Mono.AddIns是更好的選擇。 –
您可以通過添加加載代碼並初始化加載項來更新您的問題嗎? –
使用MAF的原因是因爲我們認爲我們需要隔離appdomains。我們必須同時支持同一插件的新舊版本的運行。我們也會看看Mono Addins。更新了問題中的代碼以包含加載。 – Julius