草庐IT

appDomain

全部标签

c# - 从程序集中强制卸载 DLL

我正试图从我的.NET进程中卸载一个行为异常的第三方DLL,因为它似乎导致了一个问题,这个问题总是可以通过重新启动我的应用程序来解决。我不想重新启动应用程序,而是想删除并重新加载DLL。DLL正在使用LoadLibrary加载并使用FreeLibrary删除(使用从P/Invoke网站获取的DllImport)。当我调用LoadLibrary()时,我看到DLL出现在ProcessExplorer的DLL列表中,而当我调用FreeLibrary()时,我看到DLL从列表中消失DLL-正如预期的那样。但是,一旦我调用了第三方库的Initialize()函数,FreeLibrary()就不

c# - 通过 PublicKeyToken 防止外部程序集注入(inject)

我正在使用以下代码:AppDomain.CurrentDomain.AssemblyLoad+=(sender,args)=>{vartoken=args.LoadedAssembly.GetName().GetPublicKeyToken();if(!IsValidToken(token)){Process.GetCurrentProcess().Kill();}};其中IsValidToken()将正在加载的程序集的公钥token与在我的应用程序中硬编码为字节数组的授权公钥token列表进行比较。这是防止代码注入(inject)攻击的良好安全措施吗?另外,考虑到我稍后会使用NetR

c# - 无法将透明代理强制转换为来自 AppDomain 的类型

我正在尝试在应用程序域中创建一个对象:vartype=typeof(CompiledTemplate);varobj=(CompiledTemplate)domain.CreateInstanceAndUnwrap(type.Assembly.FullName,type.FullName);但是,我总是得到以下错误:无法将透明代理转换为类型“Mono.TextTemplating.CompiledTemplate”。我在.NET4.0上运行,而不是Mono,尽管命名空间可能会提示:)据我所知,当.NET认为类型和程序集在两个域中不完全匹配时,就会发生此错误。但是,在调试时,FullNa

c# - 加载依赖于另一个域的程序集时出现 FileNotFound

这个问题在这里已经有了答案:AppDomain.Load()failswithFileNotFoundException(2个答案)关闭1年前。我正在尝试使用插件制作应用程序。我有MainLib.dll,我在其中使用1种方法创建了一些通用接口(interface)(让它成为ICommon)。然后,我制作了2个.dlls(plugins),它们引用了MainLib.dll并在某些类中实现了ICommon。此外,我删除了此.dll中的所有引用,System。然后,我创建了一个应用程序,它监视文件夹".\\Plugins"并加载newDomain中的所有.dll,检查.dll中的类型是否实现

c# - 在新的应用程序域中运行时,如何将 stdout 转换为 mstest 输出?

我一直在研究测试框架,它创建了一个新的应用程序域来运行测试。主要原因是我们正在测试的dll有一些可怕的代码,这些代码依赖于位于应用程序域路径中的dll。(不,我不能更改此代码。)我遇到的问题是,我的测试团队正在mstest中编写一堆功能测试,而其中一个写入Console.Out的记录器没有在trx输出中捕获的任何日志信息。通过控制台应用程序运行代码时,所有日志信息都可以正常输出。已实现的其他记录器也是如此。我的想法是mstest正在将自己的TextWriter设置为Console.Out,但是新的应用程序域有它自己的Console.Out的TextWriter,因为新的应用程序域有它自

c# - lock() 语句会阻塞进程/应用程序域中的所有线程吗?

也许这个问题听起来很愚蠢,但我不明白“关于线程和锁定的一些事情,我想得到确认(here'swhyIask)”。因此,如果我有10台服务器并且同时有10个请求到达每个服务器,那么整个服务器场就有100个请求。如果没有锁定,那就是对数据库的100个请求。如果我这样做:privatestaticreadonlyobjectmyLockHolder=newobject();if(Cache[key]==null){lock(myLockHolder){if(Cache[key]==null){Cache[key]=LengthyDatabaseCall();}}}我将执行多少数据库请求?10?

c# - 使用 AppDomain.AssemblyResolve 事件

我正在尝试使用AppDomain.AssemblyResolve事件来处理异常,同时解析运行时加载的某些dll的程序集(SerializationExceptionfordynamicallyloadedType)。当事件被触发时,我加载目录中的所有DLL并创建一个Assembly数组,然后我使用此方法获取包含我指定类型的Assembly:publicstaticAssemblyGetAssemblyContainingType(StringcompleteTypeName,Assembly[]assemblies){Assemblyassembly=null;foreach(Asse

c# - 进行跨应用域调用的最简单方法?

我需要在另一个应用程序域中调用对象的方法(传递参数并获取结果)。想法?UPD这两个AppDomain都不是由我的代码创建的(主机应用程序创建它,然后我的代码被调用)。如何从一个AppDomain访问另一个AppDomain? 最佳答案 如果您在另一个域中创建了一个对象,例如与AppDomain.CreateInstanceAndUnwrap,调用另一个域中的对象所需要做的就是调用对象的方法。进行跨应用程序域调用的最简单方法就是直接对该对象进行调用,该对象实际上是通过其代理从另一个域公开的,存在于另一个域中。UPD不幸的是,获得主机域

c# - 几个 AppDomains 和 native 代码

我的C#应用程序使用非线程安全的native代码。我可以运行该本地代码的多个进程,使用进程间通信来实现并发。我的问题是,我是否可以改用AppDomains,以便多个托管线程(每个线程位于不同的AppDomain上)调用native代码并且它们不会相互干扰?主要目标是防止进程分离。 最佳答案 不,AppDomains是一个纯粹的托管代码概念。它通过将托管对象根分开来实现隔离。一个AppDomain看不到另一个AppDomain的对象,这使得中止代码和卸载程序集变得非常安全。绝非偶然,它会丢弃所有可能包含状态的数据。非托管代码完全不知道

c# - 由于过时的 CAS 政策,寻求替代 AppDomain.CreateDomain(string, evidence)

我正在学习Microsoft.NetFramework--ApplicationDevelopmentFoundationTrainingKit书第8章第2课:配置应用程序域ShowWinIni是我要执行的程序的程序集名称object[]hostEvidence={newZone(SecurityZone.MyComputer)};Evidencee=newEvidence(hostEvidence,null);//CreateanAppDomain.AppDomaind=AppDomain.CreateDomain("NewDomain",e);//Runtheassemblyd.E