Tag: appdomain

如何在使用reflection加载的程序集中使用Castle.Windsor

假设我有一个库Lib.dll,它使用Castle.Windsor初始化其服务。 我有一个主应用程序App.exe,它使用reflection在运行时加载Lib.dll。 App.exe事先并不知道Lib.dll的位置,它只在运行时才知道。 在这种情况下,当App.exe加载Lib.dll和Lib.dll初始化其服务时,会抛出System.TypeInitializationExceptionexception,因为Castle.Windsor无法找到服务类型。 Castle.MicroKernel.SubSystems.Conversion.ConverterException: Could not convert from ‘Lib.TheServiceClass’ to System.Type – Maybe type could not be found at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.PerformConversion(String value, Type targetType) in e:\OSS.Code\Castle.Windsor\src\Castle.Windsor\MicroKernel\SubSystems\Conversion\TypeNameConverter.cs:line 91 at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion(String value, Type targetType) in e:\OSS.Code\Castle.Windsor\src\Castle.Windsor\MicroKernel\SubSystems\Conversion\DefaultConversionManager.cs:line 134 at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion[TTarget](String value) in e:\OSS.Code\Castle.Windsor\src\Castle.Windsor\MicroKernel\SubSystems\Conversion\DefaultConversionManager.cs:line 162 at Castle.Windsor.Installer.DefaultComponentInstaller.SetUpComponents(IConfiguration[] configurations, IWindsorContainer container, IConversionManager converter) in e:\OSS.Code\Castle.Windsor\src\Castle.Windsor\Windsor\Installer\DefaultComponentInstaller.cs:line 196 at Castle.Windsor.Installer.DefaultComponentInstaller.SetUp(IWindsorContainer container, IConfigurationStore […]

在appdomain中加载静态类

我在C#AppDomain遇到了一个大问题。 我需要在.dll文件中加载一个静态类并执行它的方法: 当我尝试加载它们时 Assembly.LoadFrom(“XXXXX”) // (XXXXX is the full path of dll) .dll不会自动或以编程方式卸载。 当我尝试在AppDomain中加载它们时 adapterDomain = AppDomain.CreateDomain(“AdapterDomain”); (a)adapterDomain.CreateInstanceFrom(this.AdapterFilePath, this.AdapterFullName); (b)adapterAssembly=adapterDomain.Load(AssemblyName.GetAssemblyName(this.AdapterFilePath)); 如果我使用方法(a),因为目标类是静态类,它不起作用。 如果我使用方法(b),因为目标.dll与我的项目不是同一个目录,我将得到一个例外。 如何加载.dll和静态类,然后在使用后卸载.dll?

读取字符串实习池的内容

我想枚举字符串实习池中的字符串 。 也就是说,我想得到string的所有实例s列表,这样: string.IsInterned(s) != null 有谁知道这是否可能?

加载字节数组assembly

我正在尝试使用字节数组加载程序集,但我无法弄清楚如何让它正常工作。 这是设置: public static void Main() { PermissionSet permissions = new PermissionSet(PermissionState.None); AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory }; AppDomain friendlyDomain = AppDomain.CreateDomain(“Friendly”, null, setup, permissions); Byte[] primary = File.ReadAllBytes(“Primary.dll_”); Byte[] dependency = File.ReadAllBytes(“Dependency.dll_”); // Crashes here saying it can’t find the file. friendlyDomain.Load(dependency); AppDomain.Unload(friendlyDomain); Console.WriteLine(“Stand successful”); Console.ReadLine(); } 我创建了两个模拟dll,并故意将其扩展名重命名为“.dll_”,因此系统无法找到物理文件。 primary和dependency正确填充,但是当我尝试使用二进制数据调用AppDomain.Load方法时,它返回: Could […]

如何使用AppDomain限制静态类的范围以便线程安全使用?

我被一个架构不佳的解决方案所困扰。 它不是线程安全的! 我在解决方案中有几个共享类和成员,在开发过程中一切都很酷…… BizTalk已经沉没了我的战舰。 我们使用自定义BizTalk适配器来调用我的程序集。 适配器正在调用我的代码并并行运行,所以我假设它在同一个AppDomain下使用多个线程。 我想做的是让我的代码在自己的AppDomain下运行,这样我所遇到的共同问题就不会相互混淆。 我有一个非常简单的类,BizTalk适配器实例化然后运行Process()方法。 我想在我的Process()方法中创建一个新的AppDomain,所以每次BizTalk都旋转另一个线程时,它将拥有自己的静态类和方法版本。 BizTalkAdapter代码: // this is inside the BizTalkAdapter and it is calling the Loader class // private void SendMessage(IBaseMessage message, TransactionalTransmitProperties properties) { Stream strm = message.BodyPart.GetOriginalDataStream(); string connectionString = properties.ConnectionString; string msgFileName = message.Context.Read(“ReceivedFileName”, “http://schemas.microsoft.com/BizTalk/2003/file-properties”) as string; Loader loader = new Loader(strm, msgFileName, connectionString); loader.Process(); EventLog.WriteEntry(“Loader”, […]

应用程序域用于什么?

我大致了解AppDomain是什么,但是我并不完全理解AppDomain的用途。 我参与了一个基于服务器的大型C#/ C ++应用程序,我想知道如何使用AppDomains来提高稳定性/安全性/性能。 特别是: 我理解一个域中的错误或致命exception不会影响在同一进程中运行的其他应用程序域 – 这是否也适用于非托管/ C ++exception,甚至可能是堆损坏或其他内存问题。 AppDomain间通信如何工作? 如何使用AppDomains与简单地生成许多进程有什么不同?

从AppDomain卸载.DLL所需的帮助 – 即使使用ShadowCopy仍然无法正常工作

我正在尝试执行以下操作。 应用程序A是“母亲应用程序”。 它保持开放。 App B只是一个.DLL,我写了一些从App A中指定的接口派生的类。 然后,从App A,我将从App B“导入”类并在其中运行方法。 我希望能够动态更改App B(更改代码并重新编译)并使用App A中的新代码。 我在App B中有一个后编译命令,它将新的.DLL复制到App A目录。 应用A创建一个新的AppDomain并使用ShadowCopying。 我认为这就足够了,但是当我尝试重新编译和复制App B的新.DLL时,它表示该文件正在使用中且无法覆盖。 这是我现在的代码: App A(代码中的TestServer): namespace TestServer { public interface IRunnable { void Run(); } class Program { static void Main(string[] args) { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationName = “DemoApp”; setup.ApplicationBase = Environment.CurrentDirectory; setup.ShadowCopyDirectories = Environment.CurrentDirectory; setup.ShadowCopyFiles = […]

将当前程序集加载到不同的AppDomain中

我创建了一个具有不同基目录的AppDomain 。 但是,我似乎无法将当前正在执行的程序集加载到其他AppDomain中,而没有基本目录中当前正在执行的程序集的副本。 我甚至试图从字节加载它。 我尝试加载时没有exception,但是当我尝试使用时: domain.DoCallBack(new CrossAppDomainDelegate(… 我明白了: 无法加载文件或程序集………..系统找不到指定的文件。 我的代码如下: private static void SaveAssemblies(Assembly ass, List assemblyByteList) { AssemblyName[] assNames = ass.GetReferencedAssemblies(); foreach (AssemblyName assName in assNames) { Assembly referedAss = Assembly.Load(assName); if (!referedAss.GlobalAssemblyCache) { SaveAssemblies(referedAss, assemblyByteList); } } byte[] rawAssembly = File.ReadAllBytes(ass.Location); assemblyByteList.Add(rawAssembly); } public static AppDomain CreateAppDomain(string dir, string name) { AppDomainSetup domainSetup […]

如何在AppDomains中将引用作为方法参数传递?

我一直在尝试使用以下代码(所有内容都在同一个程序集中定义): namespace SomeApp{ public class A : MarshalByRefObject { public byte[] GetSomeData() { // } } public class B : MarshalByRefObject { private A remoteObj; public void SetA(A remoteObj) { this.remoteObj = remoteObj; } } public class C { A someA = new A(); public void Init() { AppDomain domain = AppDomain.CreateDomain(“ChildDomain”); string currentAssemblyPath = […]

在运行时加载2个版本的程序集

在过去的几周里我一直试图破解这个问题,但还没有找到一个好的解决方案; 希望我能在这里得到答案。 我有两个程序集(ZA和ZB),它们都指向一个公共项目/ dll(ZC)但可能在不同的版本上(即相同的dll名称,相同的名称空间,某些类可能不同)。 但是,如果一个程序集在运行时由另一个程序集加载(例如A加载B),那么每个程序集都可以单独工作,那么我无法使其工作。 需要一些帮助。 这是设置: ZA依赖于ZC(通用)版本1.1 ZB依赖于ZC 1.0版 ZA需要在运行时加载需要在ZB(依赖于ZC)中加载某些东西。 ZA是主应用程序。 在它的bin目录下,有一个插件目录plugins/plugin-ZB ,我希望在其下放置所有ZB及其依赖项(ZC)。 这是我到目前为止所尝试的内容: Assembly.Load()使用相同版本的dll – 工作正常。 Assembly.Load()使用不同版本的dll – ZB加载,但是当方法运行时,我得到一个找不到exception的方法。 AppDomain.Load()找不到文件错误; 我甚至使用委托来解决程序集。 关于ZC的一些细节: – 一些方法是公共静态(有些不是)。 例如Log.Log(“hello”); – 有些人可能会返回值(基元或对象)。 – 某些方法是非静态的(和返回值)。 救命? – TIA