Questions tagged «appdomain»

8
如何使用所有引用递归将程序集加载到AppDomain?
我想加载到AppDomain具有复杂引用树的新程序集(MyDll.dll-> Microsoft.Office.Interop.Excel.dll-> Microsoft.Vbe.Interop.dll-> Office.dll-> stdole.dll) 据我了解,将程序集加载到时AppDomain,其引用不会自动加载,而我必须手动加载它们。因此,当我这样做时: string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory string path = System.IO.Path.Combine(dir, "MyDll.dll"); AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup); domain.Load(AssemblyName.GetAssemblyName(path)); 并得到FileNotFoundException: 无法加载文件或程序集'MyDll,版本= 1.0.0.0,文化=中性,PublicKeyToken =空'或其依赖项之一。该系统找不到指定的文件。 我认为关键部分是其依赖项之一。 好吧,我之前要做 domain.Load(AssemblyName.GetAssemblyName(path)); foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies()) { domain.Load(refAsmName); } 但是FileNotFoundException再次出现在另一个(引用的)程序集上。 如何递归加载所有引用? …

8
如何在设计时可靠地确定使用var声明的变量的类型?
我正在为emacs中的C#完成(智能)功能。 这个想法是,如果用户键入一个片段,然后通过特定的按键组合要求完成,则完成设施将使用.NET反射来确定可能的完成。 这样做需要知道完成的事物的类型。如果是字符串,则存在一组已知的可能方法和属性。如果是Int32,则具有单独的集合,依此类推。 使用语义,emacs中提供了一个代码lexer / parser程序包,我可以找到变量声明及其类型。鉴于此,很容易使用反射来获取类型上的方法和属性,然后向用户显示选项列表。(好吧,在 emacs中执行操作不是很简单,但是使用在 emacs 中运行powershell进程的功能会变得容易得多。我编写了一个自定义.NET程序集进行反射,将其加载到powershell中,然后在运行时在elisp中运行emacs可以通过comint将命令发送到powershell并读取响应。因此emacs可以快速获得反射结果。) 当代码用于var完成事物的声明时,问题就来了。这意味着未明确指定类型,并且补全将不起作用。 使用var关键字声明变量时,如何可靠地确定使用的实际类型?只是要清楚一点,我不需要在运行时确定它。我想在“设计时”确定它。 到目前为止,我有这些想法: 编译并调用: 提取声明语句,例如`var foo =“ a string value”;` 连接语句`foo.GetType();` 动态将生成的C#片段编译为新程序集 将程序集加载到新的AppDomain中,运行片段并获取返回类型。 卸下并丢弃组件 我知道该怎么做。但是,对于编辑器中的每个完成请求,这听起来都是非常沉重的。 我想我不需要每次都需要新的AppDomain。我可以将单个AppDomain重复用于多个临时程序集,并在多个完成请求中分摊设置和拆除它的成本。这更多是对基本概念的调整。 编译并检查IL 只需将声明编译到模块中,然后检查IL,以确定编译器推断出的实际类型。这怎么可能?我将用什么来检查IL? 还有更好的主意吗?注释?建议? 编辑 -对此进行进一步的考虑是不可接受的,因为调用可能会产生副作用。因此,必须排除第一个选项。 另外,我想我不能假设存在.NET 4.0。 更新 -上面没有提到的正确答案,但由埃里克·利珀特(Eric Lippert)轻轻指出,是实现完整的保真类型推断系统。这是在设计时可靠地确定var类型的唯一方法。但是,这也不容易做到。因为我没有幻想要尝试构建这样的东西,所以我选择了选项2的快捷方式-提取相关的声明代码,并进行编译,然后检查生成的IL。 实际上,这对于完成方案的相当一部分是有效的。 例如,假设在以下代码片段中,?是用户要求完成的位置。这有效: var x = "hello there"; x.? 完成将认识到x是一个String,并提供适当的选项。它通过生成并编译以下源代码来完成此操作: namespace N1 { static class dmriiann5he …

3
如何在不违反继承安全规则的情况下在.NET 4+中实现ISerializable?
背景:Noda Time包含许多可序列化的结构。尽管我不喜欢二进制序列化,但在1.x时间线中,我们收到了许多支持它的请求。我们通过实现ISerializable接口来支持它。 我们已经收到了有关.NET Fiddle中Noda Time 2.x 的最新问题报告。使用Noda Time 1.x的相同代码可以正常工作。抛出的异常是这样的: 重写成员时违反了继承安全性规则:“ NodaTime.Duration.System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)”。覆盖方法的安全可访问性必须与被覆盖方法的安全可访问性相匹配。 我将其范围缩小到目标框架:1.x面向.NET 3.5(客户端配置文件);2.x面向.NET 4.5。它们在支持PCL与.NET Core以及项目文件结构方面有很大的不同,但这似乎无关紧要。 我已经设法在一个本地项目中重现了它,但是还没有找到解决方案。 在VS2017中重现的步骤: 创建一个新的解决方案 创建一个针对.NET 4.5.1的新的经典Windows控制台应用程序。我称它为“ CodeRunner”。 在项目属性中,转到“签名”,然后使用新密钥对部件进行签名。取消选中密码要求,然后使用任何密钥文件名。 粘贴以下代码进行替换Program.cs。这是此Microsoft示例中的代码的简化版本。我将所有路径保持不变,因此,如果您想返回完整的代码,则无需更改其他任何内容。 码: using System; using System.Security; using System.Security.Permissions; class Sandboxer : MarshalByRefObject { static void Main() { var adSetup = new AppDomainSetup(); adSetup.ApplicationBase = System.IO.Path.GetFullPath(@"..\..\..\UntrustedCode\bin\Debug"); var permSet = …

6
.NET Core中没有AppDomains!为什么?
微软为什么不选择在.NET Core中支持AppDomains的理由很充分? 当构建长时间运行的服务器应用程序时,AppDomains尤其有用,在这种情况下,我们可能希望以合适的方式更新服务器加载的程序集,而无需关闭服务器。 如果没有AppDomains,我们将如何在长时间运行的服务器进程中替换程序集? AppDomains还为我们提供了一种隔离服务器代码不同部分的方法。就像,自定义Websocket服务器可以在主应用程序域中具有套接字代码,而我们的服务则在辅助应用程序域中运行。 如果没有AppDomains,则不可能出现上述情况。 我可以看到一个论点,它可能涉及使用VM的Cloud概念来处理程序集更改,而不必承担AppDomains的开销。但这是微软的想法或说法吗?还是他们有上述情况的特定原因和替代方案?

4
什么是.NET应用程序域?
特别是,在两个不同的应用程序域中运行代码的含义是什么? 数据通常如何跨应用程序域边界传递?它与跨过程边界传递数据是否一样?我很好奇要进一步了解这种抽象及其有用之处。 编辑:在我不了解应用程序域,一般来说,AppDomain类的现有良好覆盖范围
83 .net  appdomain 

3
我不了解应用程序域
.NET具有“应用程序域”的概念,据我了解,该域可用于将程序集加载到内存中。我已经对“应用程序域”进行了一些研究,还去了我的本地书店以获取有关此主题的更多知识,但这似乎很匮乏。 我所知道的我对应用程序域所能做的就是将程序集加载到内存中,并且可以在需要时卸载它们。 我提到的应用程序域的其他功能是什么?线程是否遵守应用程序域的边界?在通信性能之外,将程序集加载到除主要应用程序域以外的其他应用程序域中是否有任何缺点? 链接到讨论应用程序域的资源也将很好。我已经签出了MSDN,它没有太多关于它们的信息。
80 .net  appdomain 

9
有没有一种方法可以强制将所有引用的程序集加载到应用程序域中?
我的项目是这样设置的: 项目“定义” 项目实施” 项目“消费者” 项目“消费者”同时引用了“定义”和“实施”,但是没有静态引用“实施”中的任何类型。 当应用程序启动时,“消费者”项目将在“定义”中调用一个静态方法,该方法需要在“实施”中查找类型 有没有一种方法可以强制将任何引用的程序集加载到App Domain中,而无需知道路径或名称,并且最好不必使用成熟的IOC框架?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.