从AppDomain解决InvalidOperationException

时间:2015-10-30 14:26:41

标签: c# plugins appdomain

我正在使用在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无效。

1 个答案:

答案 0 :(得分:2)

以防万一其他人遇到同样的问题,像这样创建AppDomain似乎可以解决它。

Evidence evidence = AppDomain.CurrentDomain.Evidence
AppDomain appDomain = AppDomain.CreateDomain("MyDomain", evidence);