我正在使用在AppDomains中运行的插件基本上使用此代码
<% @timetables.each do |timetable| %>
<tr>
<td><%= timetable.name %></td>
<td><%= link_to "Download Resume", timetable.attachment_url %></td>
<td><%= button_to "Delete", timetable, method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #{timetable.name}?" %></td>
</tr>
<% end %>
AppDomain appDomain = AppDomain.CreateDomain("MyDomain");
PluginLoader loader = appDomain.CreateInstanceFromAndUnwrap(
Assembly.GetExecutingAssembly().Location, typeof(PluginLoader).FullName);
loader.LoadPlugIns();
AppDomain.Unload(appDomain);
使用LoadPlugIns
加载并运行插件程序集。
这似乎是一个很好记录的典型设计模式(例如How to Load an Assembly to AppDomain with all references recursively?)。一个例外可能是可以同时加载多个AppDomain,这反过来又会加载相同的程序集文件。我不明白为什么会造成这些问题。
但是,在我的情况下,有时会使用此堆栈跟踪抛出Assembly.LoadFrom()
:
InvalidOperationException
我正在努力理解为什么会发生这种情况以及如何解决这个问题。似乎异常不是从我的代码触发的。所以没有机会在System.InvalidOperationException: Handle is not initialized.
at System.WeakReference.set_Target(Object value)
at System.Runtime.Remoting.IdentityHolder.SetIdentity(Identity idObj, String URI, DuplicateIdentityOption duplicateOption)
at System.Runtime.Remoting.IdentityHolder.FindOrCreateIdentity(String objURI, String URL, ObjRef objectRef)
at System.Runtime.Remoting.RemotingServices.InternalUnmarshal(ObjRef objectRef, Object proxy, Boolean fRefine)
at System.Runtime.Remoting.RemotingServices.CreateProxyForDomain(Int32 appDomainId, IntPtr defCtxID)
at System.AppDomain.GetDefaultDomain()
at System.AppDomain.get_EvidenceNoDemand()
at System.AppDomain.get_Evidence()
at System.IO.IsolatedStorage.IsolatedStorage.InitStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType)
at System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType)
at MS.Internal.IO.Packaging.PackagingUtilities.ReliableIsolatedStorageFileFolder.Dispose(Boolean disposing)
at MS.Internal.IO.Packaging.PackagingUtilities.ReliableIsolatedStorageFileFolder.Finalize()
/ try
块中捕获它。我尝试按Unregister Lease throws InvalidOperationException中的建议注册AppDomain无效。
答案 0 :(得分:2)
以防万一其他人遇到同样的问题,像这样创建AppDomain似乎可以解决它。
Evidence evidence = AppDomain.CurrentDomain.Evidence
AppDomain appDomain = AppDomain.CreateDomain("MyDomain", evidence);