假设我有一个非默认的应用域名.我想获得对默认应用程序域的引用,并导致在其中创建一个运行一段代码的线程.这可能吗?我能想到这样做的唯一方法是将我的程序集重新加载到Default app域中,并在一个类型的构造函数中有一些逻辑,这些构造函数表明它已经被重新加载以启动这个新线程.这似乎相当复杂.有更直接的方法吗?另一方面,如果有一种方法可以做到这一点,那似乎会绕过.NET的整个安全模型.
我需要在.NET 4.0进程中动态创建.NET 2.0兼容程序集.目前通过以下方式实现:
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(...)
ModuleBuilder mb = assemblyBuilder.DefineDynamicModule(...);
Run Code Online (Sandbox Code Playgroud)
但不幸的是,所有dll的产生都是.NET 4.0(继承自我的4.0进程),这与我的其他.NET 2.0进程无关.
知道2个不同的CLR版本的AppDomain如何在同一个进程中共存?
在.NET网站中,我需要获取用户提交的代码,编译并执行它.但我需要在隔离的环境中执行代码,这样任何恶意代码都不会损害我的系统(例如,不应该执行任何Directory.Delete("C:\ Windows")).
是否可以在一种chroot环境中执行代码?
根据MSDN,AppDomain.Unload导致卸载AppDomain中的所有线程抛出线程中止异常.
域中的线程使用Abort方法终止,该方法在线程中抛出ThreadAbortException.虽然线程应该立即终止,但它可以在finally子句中继续执行不可预测的时间量.- 来自MSDN
所以我的理解是每次我在任何预期在这个AppDomain中运行的代码编写代码时,我都不得不期望任何线程都可以随时发生线程中止.这是真的?所有代码都应该假设可以随时抛出ThreadAbortException吗?
实际上这实际上是elimates catch(Exception ex),因为它会捕获ThreadAbortException并尝试处理它,通常是通过记录一个真的不应该记录的错误(因为卸载AppDomain实际上不是一个例外).
是否还需要考虑其他因素以避免不必要的异常处理/错误记录?
在加载某些程序集时,ASP.NET是否将所有依赖项程序集(位于BIN文件夹中)加载到默认的appdomain?或者它将"按需"加载(当CLR需要依赖程序集中的某种类型时)?
在ASP.NET MVC Web应用程序中,我偶尔会看到以下错误:
System.AppDomainUnloadedException:尝试访问已卸载的appdomain.(来自HRESULT的异常:0x80131014)在Microsoft.Interop.Security的System.StubHelpers.StubHelpers.GetCOMHRExceptionObject(Int32hr,IntPtr pCPCMD,Object pThis)的System.StubHelpers.StubHelpers.InternalGetCOMHRExceptionObject(Int32hr,IntPtr pCPCMD,Object pThis)中. AzRoles.IAzApplication.OpenOperation(String bstrOperationName,Object varReserved)
抛出此异常的代码行是这样的:
IAzOperation operation = _azManApp.OpenOperation(operationName);
Run Code Online (Sandbox Code Playgroud)
大多数时候,代码工作正常.当错误发生时,它似乎再次出现,以便回收AppPool是唯一的好办法.
我该怎么做才能防止这种情况发生?
我有一个场景,我从我的C#代码中的操作添加DLL到GAC.然后我需要对新添加的DLL执行Assembly.Load.但是,由于进程启动时DLL不在GAC中,因此返回null.
因此,我看到代码可以在不同的AppDomain中运行,这将导致DLL在单独的AppDomain中从GAC获得.
如何将其他AppDomain中的值返回到主线程?
我只是想跑:
var type = Assembly.Load(assembly).GetType(className);
让它从其他AppDomain返回到我的主线程.
提前致谢.
最近我使用外部DLL库,我对它没有任何影响.在某些特殊情况下,此第三方dll的方法是阻塞并且永不返回.
我试图通过在新的AppDomain中执行此方法来解决此问题.在自定义超时后,我想卸载AppDomain并杀死所有这些垃圾;)
不幸的是,它不起作用 - 正如有人所期望的那样.
一段时间后,它会抛出CannotUnloadAppDomainException,因为阻塞方法不允许正常中止线程.
我依赖于使用这个库,似乎不会很快有更新.
那么我可以解决这个问题,即使这不是最佳做法吗?任何糟糕的黑客赞赏:)
我已经尝试过以下选项:
var resourcePath = "data.xml";
Application files are located in: c:/MyApp/bin/Release.
AppDomain.CurrentDomain.BaseDirectory refers to "c:/MyApp" folder.
AppDomain.CurrentDomain.SetupInformation.PrivateBinPath refers to "c:/MyApp/bin/Release" folder.
HttpContext.Current.Server.MapPath(resourcePath) refers to http://www.domain.com/MyApp/data.xml
Run Code Online (Sandbox Code Playgroud)
只有PrivateBinPath起作用,但是根据定义它可以包含多个bin目录,所以也许我不应该使用它。
Web API应用程序访问Bin文件夹中的文件的标准方法是什么?
我有四个程序集,ModuleStatic,Loader以及ModuleA和ModuleB,除了可执行程序Loader之外,它们都是DLL。
在DLL ModuleStatic中:
public class ModuleStatic {
public static string Foo { get; set; } = "Foo";
}
Run Code Online (Sandbox Code Playgroud)
在Loader中,将通过Assembly.Load和AppDomain将ModuleA和ModuleB分别加载到domA和domB。如果ModuleA修改了ModuleStatic.Foo变量,则domB中的ModuleB会收到修改吗?
appdomain ×10
c# ×9
.net ×5
asp.net ×2
reflection ×2
azman ×1
clr ×1
com ×1
httpcontext ×1
isolation ×1