Tag: appdomain

在另一个AppDomain中调用Await时没有SynchronizationContext

我已经成功构建了一个插件机制,我可以在单独的AppDomain中创建UI控件,并将它们显示为主AppDomain中Form的一部分。 这些UI控件执行自己的数据加载,因此当我打开表单时,会创建大约10个不同的插件,并且每个插件都需要加载其数据。 如果我同步执行此操作,这一切都可行,但我想在每个插件中使用async / await模式。 我的刷新方法如下所示: protected async void RefreshData() { _data = await LoadAsync(_taskId); <= UI Thread 🙂 OnDataChanged(); <= Worker Thread 🙁 } 现在开始这个问题。 当我输入这个方法时,我在主UI线程上。 但是当await结束时,我在一个工作线程上,所以我在OnDataChanged()方法中得到了一个交叉线程exception,它更新了控件。 await应该默认使用SynchronizationContext.Current来继续,但由于我在另一个AppDomain中,这恰好是NULL。 所以我的问题是。 如何配置await继续当前线程,即UI线程? 我知道我可以获取一个控件并执行Invoke(),但我也使用MVVM模式,这是在View模型中,因此我无法访问任何控件,所有View Model – > View通信都是通过数据完成的绑定。

ASP.net UserControl和AppDomain TypeResolve

我正在使用VirtualPathProvider来包含编译时不可用的用户控件。 除了对实际包含控件的dll的引用外,一切都正常工作。 当调用具有控件的页面时,除非将dll放在bin文件夹中,否则无法找到控件类型。 错误:分析程序错误说明:解析为此请求提供服务所需的资源时发生错误。 请查看以下特定的解析错误详细信息并相应地修改源文件。 分析器错误消息:无法加载类型“App.Modules.ModuleA.Controls.Entity1Item”。 来源错误: 第1行: 我试图处理所有重要的AppDomain事件(AssemblyResolve,TypeResolve和ReflectionOnlyAssemblyResolve),但没有为我的类型调用。 我在TypeResolve文档中看到,只要执行Type.GetType并且找不到类型,就会调用它。 看起来像ASCX在需要它的类型时没有触发事件……为什么? 谢谢! 亚历克斯

.NET LocalReport / .rdlc AppDomain问题

我正在使用Microsoft.Reporting.WebForms.LocalReport和.rdlc报告文件来生成.pdf:s。 这是在Windows服务(.NET 4.6,x64,VS2015)的后台完成的。 我有两个问题: Windows服务不断消耗内存,最终抛出OutOfMemoryException并终止进程 在一个事件中,整个WindowsSerivce以UnhandledException终止,尽管所有内容都包含在try-catch语句中。 现在,我已经阅读了.NET 4下的LocalReport已经改为生活在它自己的AppDomain中。 所以,在使用LocalReport时: 你应该总是在每个localReport.Render()之后调用localReport.ReleaseSandboxAppDomain()吗? 我是否必须做一些事情来处理LocalReport沙箱AppDomain中可能发生的任何exception?

多个Assembly.Load(Byte ),相同的实例或泄漏?

当我使用包含相同程序集的Byte数组多次调用Assembly.Load(Byte [])时会发生什么? 我是否会为每次通话获得相同的汇编实例? 在app域中多次加载相同的程序集???

垃圾收集对象跨越AppDomain边界

当您将从MarshalByRefObjectinheritance的对象传递给另一个AppDomain时,由创建它的AppDomain引发的GC.Collect()不会收集该对象,前提是该对象在GC.Collect时间内未在任一AppDomain中生根( )叫? [当我说没有根源时,我的意思是没有开发人员编写代码可以访问它。] 似乎对象没有被收集,而是被提升到下一代! 但是,如果我停止将对象传递给diff AppDomain,它将按预期收集。 这种行为是设计的吗? 如果是这样理由? 多谢你们, PS我知道代码中的GC.Collect()有很多原因,我只是想了解GC将如何发生在MBRO上。

.NET可移植类库属性

我有一个公共类库,包含我的服务器和客户端的许多模型。 由于客户端在Xamarin下运行,因此公共库必须是可移植类库(PCL)。 在我的服务器中,这些对象是通过AppDomain Remoting / Marshaling传递的,所以根据我的理解,对象需要标记为[Serializable]或从MarshalByRefObjectinheritance 在PCL中,我不能对我的任何模型做任何这些事情。 我的问题是:如何使这些对象与AppDomain Remoting / Marshaling一起使用并让它们驻留在可移植类库中?

SerializationException:成员“…”的类型未解析

我一直在尝试动态地将程序集加载到AppDomain。 我需要这样做,因为我想动态调用一个方法,但是在我的应用程序运行时不要保留DLL的句柄,以便在需要时可以替换它。 但是我收到了这个SerializationExceptionexception:没有为成员“…”解析类型 这是我的代码: AppDomain domain = AppDomain.CreateDomain(“Temp AppDomain”, null, AppDomain.CurrentDomain.SetupInformation); try { object obj = domain.CreateInstanceFromAndUnwrap(dllPath, typeName); IMyInterface myObj = (IMyInterface) obj; result = myObj.MyMethod(something); } finally { AppDomain.Unload(domain); }

无法将执行程序集加载到新的AppDomain,FileNotFoundException

我试图在新的AppDomain中托管文本模板类代理。 我有一些旧的脚本代码,它们执行类似的操作,包含以下代码: _ScriptAppDomain = AppDomain.CreateDomain(scriptDomainFriendlyName); _ScriptProxy = (IScriptEngineProxy)_ScriptAppDomain.CreateInstanceAndUnwrap( Assembly.GetExecutingAssembly().FullName, “LVK.Scripting.ScriptEngineProxy”); 但是,当我尝试使用我的新课程时,请使用以下内容 _TemplateDomain = AppDomain.CreateDomain(templateDomainFriendlyName); _TemplateProxy = (ITemplateProxy)_TemplateDomain.CreateInstanceAndUnwrap( Assembly.GetExecutingAssembly().FullName, “TextTemplate.TemplateProxy”); 我得到“FileNotFoundException”,其中包含以下详细信息: 无法加载文件或程序集’TextTemplate,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = bb70a2e62a722ace’或其依赖项之一。 该系统找不到指定的文件。 我错过了什么? 基本上,我在TextTemplate命名空间(和程序集)中有一个Template类,它试图将TemplateProxy类(从MarshalByRefObject降序)加载到新的appdomain中,但看起来我的主程序集没有加载到这个域中。 如果我使用较旧的代码,但不使用这个新代码,这是有效的,但我无法发现差异。 这里有一些更多的细节: 大会没有在GAC注册(旧版本也没有注册) 我没有覆盖任何AssemblyResolve事件(旧的,也没有) 如果需要的话,我不反对处理AssemblyResolve事件。 我发现我的旧代码工作很奇怪,但事实并非如此。

每个appdomain的webapi和未处理的exception挂钩

拥有WebApi 2.2应用程序 – 是否可以使用AppDomain的UnhandledException钩子? 我有一个类似于这样的代码: [assembly: OwinStartup(“DevConfiguration”, typeof(DevStartup))] namespace WebApi.Module { public class DevStartup { private const string ErrorEventSourceName = “WebApiHost”; private const int ErrorEventId = 600; [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)] public void Configuration(IAppBuilder app) { AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; … throw new Exception(“some exception); } public static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) { EventLog.WriteEntry(ErrorEventSourceName, ex.ToString(),EventLogEntryType.Error, ErrorEventId); } […]

反思与应用设计

让我来描述一下我现在遇到的问题和解决方案,也许你可以帮助我了解为什么这是一个坏主意(假设它是)以及我能做些什么来使它成为一个更好的系统。 现在我有600个“裂土器”解析文件并将它们翻录成csv或其他格式。 裂土器都实现了一个通用的接口和基类。 当作业排队时,取决于该作业的配置,使用reflection调用特定的开膛手。 foreach (var stream in streams) { try { // load it Assembly asm = Assembly.LoadFile(Path.Combine(stream.RipperPath, stream.RipperFileName), new Evidence()); if (asm == null) { MessageBox.Show(String.Format(“Invalid Interface ripper loaded.\n{0}”, Path.Combine(stream.RipperPath, stream.RipperFileName))); return; } foreach (Type objType in asm.GetTypes()) { if (!objType.IsPublic) continue; // make sure the type isn’t Abstract if (((objType.Attributes & TypeAttributes.Abstract) […]