Я думаю, что я определил, что, хотя я загружаю сборки в MarshalByRefObject в новом AppDomain, сборки также загружаются в родительский домен.
Вот моя структура Assembly (стрелки указывают на зависимость):
MainAssembly -> CommonInterfaceAssembly <- ExtensionAssembly
В родительском AppDomain я делаю это:
var loader = (ExtensionLoader)extDomain.CreateInstanceAndUnwrap (Assembly.GetExecutingAssembly().FullName, "ExtensionLoader");
loader.loadExtensions (this);
, а класс Loader:
class ExtensionLoader : MarshalByRefObject
{
public List<IExtension> loadExtensions (ExtensionMgr mgr)
{
// Delegate to Addins to return the list of extensions
AddinManager.Initialize ();
AddinManager.Registry.Update ();
AddinManager.GetExtensionObjects<IExtension> ();
var extensions = new List<IExtension> (AddinManager.GetExtensionObjects<IExtension> ());
foreach (var ext in extensions) {
ext.Initialize (mgr);
}
return extensions;
}
}
Я не знаюесли это имеет отношение к вопросу, но я использую Mono.Addins для загрузки расширений в новом домене приложений, поэтому я оставил этот код внутри. Из того, что я могу сказать, хотя все работает хорошо до того момента, когда я вызываю метод Initializeна каждом из расширений.
Таким образом, я запустил этот сценарий с ExtensionAssembly в том же каталоге, что и основной исполняемый файл, и в отдельном каталоге 'extensions'.Что мне интересно, так это то, что когда я вызываю ext.Initialize, либо ExtensionAssembly загружается в родительский AppDomain (если он существует в том же каталоге), либо я получаю трассировку стека ниже, если нет.Есть идеи почему?
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (System.Runtime.Remoting.Proxies.RealProxy rp, IMessage msg, System.Exception& exc, System.Object[]& out_args) [0x001f0] in /home/tim/tmp/mono-2.10.8/mcs/class/corlib/System.Runtime.Remoting.Proxies/RealProxy.cs:247
Exception rethrown at [1]:
---> System.IO.FileNotFoundException: Could not load file or assembly 'Extensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Extensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity, Boolean refonly) [0x00047] in /home/tim/tmp/mono-2.10.8/mcs/class/corlib/System/AppDomain.cs:785
at System.AppDomain.Load (System.String assemblyString) [0x00000] in /home/tim/tmp/mono-2.10.8/mcs/class/corlib/System/AppDomain.cs:762