当MarshalByRef对象从AppDomain(1)传递到另一个(2)时,如果你在第二个AppDomain(2)中调用方法之前等待6分钟,你将得到一个RemotingException:
System.Runtime.Remoting.RemotingException:对象[...]已断开连接或在服务器上不存在.
有关此问题的一些文档:
如果我错了,请纠正我:如果InitializeLifetimeService返回null,那么当AppDomain 2被卸载时,该对象只能在AppDomain 1中收集,即使收集了代理?
有没有办法禁用生命周期并保持代理(在AppDomain 2中)和对象(在AppDomain1中)保持活动状态,直到代理完成为止?也许与ISponsor ......?
场景:我使用Web部署项目部署了一个n层企业ASP.NET应用程序.所有层都生成ASP.NET应用程序使用的独立程序集.
问题:当我运行应用程序时.部署后第一次将相关程序集加载到内存中需要花费大量时间.但一旦加载其照明快速应用程序.如果没有用户访问该应用程序,IIS将从内存中卸载程序集,当用户尝试在以后的实例上访问该应用程序时,它会再次加载所有程序集,并且需要花费相同的时间来加载它这是第一次这样做.
我正在寻找一种解决方案,使我能够将我的程序集加载到内存中,持续覆盖程序集的易变性,以实现内存驻留.
或任何其他解决方案,让我的用户愉快地使用该应用程序解决上述问题.
背景
我有一个Windows服务,它使用各种第三方DLL来执行PDF文件的工作.这些操作可能会占用相当多的系统资源,并且在发生错误时偶尔会出现内存泄漏.DLL是围绕其他非托管DLL的托管包装器.
现行解决方案
我已经在一个案例中通过在专用控制台应用程序中包含对其中一个DLL的调用并通过Process.Start()调用该应用程序来缓解此问题.如果操作失败并且存在内存泄漏或未释放的文件句柄,则无关紧要.该过程将结束,操作系统将恢复句柄.
我想将这个相同的逻辑应用到我的应用程序中使用这些DLL的其他地方.但是,我对于在我的解决方案中添加更多控制台项目并编写更多可以调用Process.Start()并解析控制台应用程序输出的样板代码感到非常兴奋.
新解决方案
专用控制台应用程序和Process.Start()的优雅替代方案似乎是使用AppDomains,如下所示:http: //blogs.geekdojo.net/richard/archive/2003/12/10/428.aspx.
我在我的应用程序中实现了类似的代码,但单元测试并不乐观.我在一个单独的AppDomain中创建一个测试文件的FileStream,但不要处理它.然后我尝试在主域中创建另一个FileStream,并且由于未释放的文件锁而失败.
有趣的是,将空DomainUnload事件添加到工作程序域会使单元测试通过.无论如何,我担心可能创建"工人"AppDomains无法解决我的问题.
思考?
代码
/// <summary>
/// Executes a method in a separate AppDomain. This should serve as a simple replacement
/// of running code in a separate process via a console app.
/// </summary>
public T RunInAppDomain<T>( Func<T> func )
{
AppDomain domain = AppDomain.CreateDomain ( "Delegate Executor " + func.GetHashCode (), null,
new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory } );
domain.DomainUnload += ( sender, e ) => …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建Facebook应用程序.然而,在创造精灵完成他的工作之后,我遇到了麻烦.
在创建的向导中没有更改任何内容我遇到了错误:
Error
You have specified an App Domain but have not specified a valid integration URL.
secure-citadel-xxxx.herokuapp.com must be derived from one of: Site URL, Mobile
Site URL, Canvas URL, Secure Canvas URL, Page Tab URL or Secure Page Tab URL.
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了它,发现它可能没有答案.
添加http://等等不会产生任何超出域无效的错误.
有谁知道要处理它吗?
我最近更新到Resharper 8,当我试图运行一套项目时.这些测试包含两套集成测试,它们都使用IISExpress来运行网站,发出Web请求并检查响应.
单独运行它们是成功的,并且运行所有测试之前会成功.但是,在运行后,第二组运行测试将失败.
调查显示,这AppDomain.CurrentDomain.BaseDirectory是第一次试运行而不是改变.由于集成测试由两个项目组成,这导致第二个项目失败,因为它找不到任何所需的配置文件.
我在Resharper 8中找不到任何禁用这种不同行为的选项,这似乎是/domain:Singlenunit标志的行为.没有降级到Resharper 7,有人知道解决方案吗?它是Resharper 8的预期行为还是一个bug?
以下是问题的原因:www.devplusplus.com/Tests/CSharp/Hello_World.
虽然之前提出了类似的问题,但网上的许多答案都有几个问题:
像这样的东西:
var evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
var permissionSet = SecurityManager.GetStandardSandbox(evidence);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找不到创建AppDomain并加载程序集的方法,该程序集不在文件系统中,而是在RAM中.
同样,上面列出了其他解决方案不起作用的原因:1.许多是4.0之前的版本,而且2.许多人依赖指向文件系统的".Load"方法.
答案2:我有一个汇编引用,因为它是由CSharpCodeProvider类生成的,所以如果你知道一种方法将它转换为字节数组,那将是完美的!
var provider = new CSharpCodeProvider(new Dictionary<String, String>
{ { "CompilerVersion", "v4.0" } });
var compilerparams = new CompilerParameters
{ GenerateExecutable = false, GenerateInMemory = true, };
var compilerResults = provider.CompileAssemblyFromSource(compilerparams,
string_Of_Code_From_A_User);
var instanceOfSomeClass = compilerResults.CompiledAssembly
.CreateInstance(className);
// The 'DoSomething' method can write to the file system and I …Run Code Online (Sandbox Code Playgroud) 我在采访中不断被问及AppDomains,我知道基础知识:
我仍然没有得到使他们成为必要的东西.当你使用一个时,我正在寻找一个合理的具体情况.
回答:
还要别的吗?
我想知道如何卸载加载到主AppDomain中的程序集.
我有以下代码:
var assembly = Assembly.LoadFrom( FilePathHere );
Run Code Online (Sandbox Code Playgroud)
当我完成时,我需要/希望能够卸载这个程序集.
谢谢你的帮助.
我需要在我的应用程序中使用跨appdomain调用,有时我有这个RemotingException:
对象'/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem'已断开连接或在服务器上不存在.
目标对象仍然存在,我已经检查过了.
UPD我在目标对象的终结器中设置断点,它永远不会命中.因此,这个对象是活着的,而不是GC.