Tag: appdomain

制作域中立程序集的步骤是什么?

……并且这些步骤是否也可以应用于第三方程序集(可能已经强名称)? 我的问题的上下文不应该很重要,但无论如何我都会分享:我正在考虑制作一个记录器(或日志包装器),它始终知道要定位的“日志源”,无论使用它的程序集是在一个应用程序域中,或分布在多个应用程序域中。 我认为实现这一目标的一种方法是使用具有静态“LogSource”属性的域中立程序集。 如果在域中性程序集中设置了静态属性,我认为所有appdomains都会看到它。

如何跨AppDomain边界传递CancellationToken?

我有一个命令对象,根据请求队列的请求进行工作。 此特定命令将在子appdomain中执行其工作。 在子appdomain中完成其工作的一部分涉及阻止ConcurrentQueue操作(例如,Add或Take)。 我需要能够通过请求队列传播中止信号,传递到子appdomain,并唤醒其中的工作线程。 因此,我认为我需要在AppDomain边界传递CancellationToken。 我尝试创建一个inheritance自MarshalByRefObject的类: protected class InterAppDomainAbort : MarshalByRefObject, IAbortControl { public InterAppDomainAbort(CancellationToken t) { Token = t; } [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)] public override object InitializeLifetimeService() { return null; } public CancellationToken Token { get; private set; } }; 并将此作为参数传递给worker函数: // cts is an instance variable which can be triggered by another […]

使用属性或MarshalByRefObject的子类化?

我想在AppDomains中使用一个对象。 为此我可以使用[Serializeable]属性: [Serializable] class MyClass { public string GetSomeString() { return “someString” } } 或MarshalByRefObject的子类: class MyClass: MarshalByRefObject { public string GetSomeString() { return “someString” } } 在这两种情况下,我都可以使用这样的类: AppDomain appDomain = AppDomain.CreateDomain(“AppDomain”); MyClass myObject = (MyClass)appDomain.CreateInstanceAndUnwrap( typeof(MyClass).Assembly.FullName, typeof(MyClass).FullName); Console.WriteLine(myObject.GetSomeString()); 为什么两种方法似乎都有相同的效果? 两种方法有什么不同? 什么时候我应该赞成一种方法而不是另一种呢? 编辑:从表面上看,我知道两种机制之间存在差异,但如果有人跳出丛林并问我这个问题,我无法给他一个正确的答案。 问题是非常开放的问题。 我希望有人可以比我能做的更好地解释它。

在新AppDomain中建立的第一个WCF连接非常慢

我有一个我使用的库,它使用WCF调用http服务来获取设置。 通常,第一次调用需要约100毫秒,后续调用只需几毫秒。 但是我发现当我创建一个新的AppDomain时,来自该AppDomain的第一个WCF调用需要2.5秒。 有没有人解释或解决为什么在新的AppDomain中首次创建WCF频道需要这么长时间? 这些是基准测试结果(当在64位版本中没有附带调试器的情况下运行时),请注意第二组数字中的第一个连接如何延长25倍以上 Running in initial AppDomain First Connection: 92.5018 ms Second Connection: 2.6393 ms Running in new AppDomain First Connection: 2457.8653 ms Second Connection: 4.2627 ms 这不是一个完整的例子,但显示了我生成这些数字的大部分内容: class Program { static void Main(string[] args) { Console.WriteLine(“Running in initial AppDomain”); new DomainRunner().Run(); Console.WriteLine(); Console.WriteLine(“Running in new thread and AppDomain”); DomainRunner.RunInNewAppDomain(“test”); Console.ReadLine(); } } […]

在不同的AppDomain中加载具有依赖项的程序集

我的目标是在两个给定的文件夹之间进行缺少的依赖性检查。 想象一下以下设置。 根\ DIRA \ A.DLL 根\ DIRB \ B.DLL B取决于A. 因此,给定这些文件夹,我想创建一个新的AppDomain,加载B.dll并让DirA(A.dll)的依赖关系自动解析并隔离在新的AppDomain中。 隔离是关键,因为当我卸载这个AppDomain时,我想创建一个新的,可能DirA再次作为依赖,但DirC库需要它,所以在DirC依赖DirB的情况下,我希望它抛出一个例外。 编辑:添加代码示例,以防有助于更好地描述我的问题。 AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = @”C:\Root”; setup.ApplicationName = “Isolated Domain” setup.PrivateBinPath = @”DirA;DirB”; setup.PrivateBinPathProbe = “”;//disable search in AppBase.. var domain = AppDomain.CreateDomain(Guid.NewGuid().ToString(), AppDomain.CurrentDomain.Evidence, setup, AppDomain.CurrentDomain.PermissionSet); //The following statement in theory should pick B.dll’s dependency from DirA. var assembly […]

在一个进程中加载​​的最大appdomains数

由于动态程序集加载需要appdomain加载以启用使用卸载相关appdomain来终止程序集,是否在要加载的进程中有“最大”数量的appdomains? 我在想一个基于服务器的应用程序,每个用户都可以动态地运行他的专有C#代码。 但是,如果2000个用户登录并加载他们的代码呢? 除了appdomians的数量之外,我可能遇到任何可能的限制吗? 谢谢。

在Visual Studio 2010中进行调试时,忽略跨AppDomains的exception

我在调试调用另一个AppDomain的应用程序时遇到问题,因为如果在其他AppDomain正在执行的任何操作中发生exception,则exception会冒泡并导致Visual Studio 2010无论如何都会中断。 我正确地包装了在try/catch中抛出的方法调用,并且当我正常运行应用程序(ASP.NET MVC应用程序)时正常捕获exception,但是在Visual Studio 2010中调试w3wp.exe时,它总是打破抛出的方法调用,即使应该被捕获,我也无法通过exception。 我试图装饰使用[DebuggerStepThrough]完成try/catch和throw方法调用的外部方法,但这绝对没有效果。 执行“继续(F5)”,“跳过(F10)”或“跳出(F11)”也不执行任何操作; Visual Studio只是稍微暂停一下,然后在相同的位置再次中断并使用完全相同的exception。 一旦Visual Studio在发生exception的位置停止,似乎绝对没有办法继续前进。 我正在做的就是调用assembly.GetExportedTypes() ,如果导出的类型引用了一个无法找到的程序集(我想忽略的情况assembly.GetExportedTypes() ,它可能会抛出。 抛出的exception是: FileNotFoundException越过了本机/托管边界 正如我所说,我正在捕捉FileNotFoundException ,它在运行应用程序时有效,但在调试时无效。 如果assembly.GetExportedTypes()抛出,我怎么能让调试器理解我给老鼠屁股? 更新: 我认为通过取消选中Visual Studio 2010中的选项“当exception跨越AppDomain或托管/本地边界(仅管理)”(在“调试”>“常规”下)时,我已经解决了这个问题,但此问题刚刚再次出现。 我已经在有问题的方法上使用了[DebuggerStepThrough] , [DebuggerStepperBoundary]和[DebuggerNonUserCodeAttribute] ,但没有任何效果。

我可以从C#在远程应用程序域中注入一个线程吗?

我想知道是否有可能将一个线程注入到一个单独进程中运行的远程应用程序域中。 我的猜测是我可以使用调试接口(ICorDebug)来做到这一点,但我想知道是否还有其他方法?

AppDomain阴影复制无法正常工作(原始程序集已锁定)

这是我用来探测可用插件列表的一个小类: internal static class PluginDirectoryLoader { public static PluginInfo[] ListPlugins(string path) { var name = Path.GetFileName(path); var setup = new AppDomainSetup { ApplicationBase = path, ShadowCopyFiles = “true” }; var appdomain = AppDomain.CreateDomain(“PluginDirectoryLoader.” + name, null, setup); var exts = (IServerExtensionDiscovery)appdomain.CreateInstanceAndUnwrap(“ServerX.Common”, “ServerX.Common.ServerExtensionDiscovery”); PluginInfo[] plugins = null; try { plugins = exts.ListPlugins(); // <– BREAK HERE […]

如何切换.NET程序集以执行一种方法?

我的.NET应用程序有不同版本的dll,大多数时候我想使用最新版本的dll。 但是,有一种方法可以在一个单独的线程上运行,我需要能够根据某些条件选择较旧版本的dll。 我已经知道只能加载一个程序集然后在默认的应用程序域中卸载它(我不能只保持两个版本都加载,因为那时我遇到了类型问题的重复定义 ) 可能我必须创建一个单独的AppDomain,在那里加载程序集然后卸载它。 此应用程序域将在单独的线程上执行一个方法,并且可以使用不同版本的库。 你认为这是一个好方法/你有更好的想法/你能指出一些能让我入手的资源吗? 非常感谢 ;)