Tag: .net

在.NET 4.0中,值类型的Equals的默认实现是什么?

这两个文档页面似乎与此主题相矛盾: ValueType.Equals方法说“Equals方法的默认实现使用reflection来比较obj和这个实例的相应字段。” Object.Equals Method(Object)说“Equals的默认实现支持引用类型的引用相等,以及值类型的按位相等 ”。 它是按位平等还是反思? 我ValueType的源代码,发现评论说 //如果此对象中没有GC引用,我们可以避免reflection //并做一个快速的memcmp 有人可以澄清“GC参考”的含义吗? 我猜这是一个有引用类型的字段,但我不确定。 如果我创建一个只有值类型字段的struct ,它的实例是否总是与快速方式进行比较? 更新: .Net 4.5的文档已得到显着改进:它没有提到的矛盾,现在可以更好地理解默认值类型相等性检查的工作原理。

在New AppDomain中加载程序集而不将其加载到Parent AppDomain中

我试图将一个DLL加载到控制台应用程序,然后卸载它并完全删除该文件。 我遇到的问题是,在自己的AppDomain中加载dll的行为会在Parent AppDomain中创建一个引用,因此不允许我销毁dll文件,除非我完全关闭程序。 有关使此代码有效的任何想法? string fileLocation = @”C:\Collector.dll”; AppDomain domain = AppDomain.CreateDomain(fileLocation); domain.Load(@”Services.Collector”); AppDomain.Unload(domain); 顺便说一下,我也尝试过这段代码而且没有运气 string fileLocation = @”C:\Collector.dll”; byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation); AppDomainSetup domainSetup = new AppDomainSetup(); domainSetup.ApplicationBase = Environment.CurrentDirectory; domainSetup.ShadowCopyFiles = “true”; domainSetup.CachePath = Environment.CurrentDirectory; AppDomain tempAppDomain = AppDomain.CreateDomain(“Services.Collector”, AppDomain.CurrentDomain.Evidence, domainSetup); //Load up the temp assembly and do stuff Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); […]

LaTeX用于生产中的PDF生成

我在读研究生时用LaTeX写了几本白皮书。 从那以后,我对LaTeX允许用户做什么有一个非常好的印象,特别是它提供的格式控制等。 现在我在讨论是否应该将LaTeX用于我们的生产应用程序来生成PDF。 我已经尝试了几个商业和免费的PDF库(PDFSharp / MigraDoc,iTextSharp,Expert PDF等),它们都没有提供我需要的精确控制量,而不会使代码库长期难以维护。 如果我决定走这条路,它将从C#完成。 由于LaTeX已经有命令行界面,我应该可以很容易地从C#中做到这一点,作为从我的程序分叉的外部进程。 但我正在寻找社区的一些评论。 有人试过吗? 如果是这样,有什么问题? 您如何看待这个想法 – 利弊(我对gotachas更感兴趣)? 欢迎所有反馈。

在switch语句中针对枚举进行编程,这是你的方法吗?

看一下代码片段: 这是我在编写枚举时通常所做的事情。 我有一个带有InvalidOperationException的默认转义(我不使用ArgumentException或它的一个派生,因为编码是针对私有实例字段而不是传入参数)。 我想知道你们的开发人员是否也编写了这个逃避的想法…. public enum DrivingState {Neutral, Drive, Parking, Reverse}; public class MyHelper { private DrivingState drivingState = DrivingState.Neutral; public void Run() { switch (this.drivingState) { case DrivingState.Neutral: DoNeutral(); break; case DrivingState.Drive: DoDrive(); break; case DrivingState.Parking: DoPark(); break; case DrivingState.Reverse: DoReverse(); break; default: throw new InvalidOperationException( string.Format(CultureInfo.CurrentCulture, “Drivestate {0} is an unknown state”, this.drivingState)); […]

我可以在.net 4中部署我的ASP.NET MVC 4应用程序

我想知道ASP.NET MVC 4应用程序可以在.NET 4服务器上运行的东西。 我正在尝试部署我的MVC4应用程序,我得到了错误。 500内部服务器错误。 您正在查找的资源存在问题,无法显示。 我的目标是.net 4框架,但我仍然有这个错误。 我不确定服务器会发生什么。 我试图查看其他post,但我没有找到任何可以清除MVC 4可以在.net服务器上运行的post。

在.NET / BCL源代码中混淆注释“string.Empty”的含义?

我试图理解为什么string.Empty是readonly而不是const 。 我看过这篇post,但我不明白微软写的关于它的评论。 正如Jon Skeet在评论中写道 : “我不知道 – 对我来说这没有多大意义,说实话……” 共享源公共语言基础结构2.0版本 。 string.cs位于sscli20 \ clr \ src \ bcl \ system \ string.cs中 // The Empty constant holds the empty string value. //We need to call the String constructor so that the compiler doesn’t mark this as a literal. //Marking this as a literal would mean […]

为什么我的Windows服务启动csc.exe实例?

我在C#中编写了一个multithreading的Windows服务。 出于某种原因,每次生成线程时都会启动csc.exe。 我怀疑它与线程本身有关,但事实上它是在每个线程的基础上发生的,并且这些线程是短暂的,这使问题非常明显:许多csc.exe进程不断启动和停止。 性能仍然相当不错,但我希望如果我能消除它,它会有所改善。 但是,更令我担心的是McAfee正在尝试扫描csc.exe实例并最终杀死该服务,显然当一个实例在扫描中期退出时。 我需要商业部署此服务,因此更改McAfee设置不是解决方案。 我假设我的代码中的某些东西正在触发动态编译,但我不确定是什么。 其他人遇到这个问题? 任何解决它的想法? 更新1: 在根据@sixlettervariables的建议和链接进行进一步研究后,问题似乎源于XML序列化的实现,如Microsoft的XmlSerializer文档中所示: 为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型。 Microsoft在同一个文档中进一步说明了优化: 基础结构查找并重用这些程序集。 仅当使用以下构造函数时,才会出现此问题: XmlSerializer.XmlSerializer(类型) XmlSerializer.XmlSerializer(Type,String) 这似乎表明只要使用了两个指定的构造函数之一,codegen和编译在第一次使用时只会发生一次。 但是,我没有从这个优化中受益,因为我正在使用另一种forms的构造函数,具体来说: public XmlSerializer(Type type,Type [] extraTypes) 进一步阅读,事实certificate,这也恰好是我在代码执行时观察到的内存泄漏的可能解释。 同样,来自同一个文档: 如果使用任何其他构造函数,则会生成同一程序集的多个版本,并且永远不会卸载,这会导致内存泄漏和性能下降。 最简单的解决方案是使用前面提到的两个构造函数之一。 否则,您必须将程序集缓存在Hashtable中。 微软建议的两个解决方法对我来说是最后的手段。 转到另一种forms的构造函数不是首选(我使用“extratypes”forms来序列化派生类,这是每个Microsoft的文档支持使用),我不确定我喜欢管理缓存的想法用于跨多个线程的程序集。 因此,我有sgen ‘,并且看到生成的类型序列化程序的组合按预期生成,但是当我的代码执行时,未加载sgen生成的程序集(在Fusion日志查看器和进程监视器中进行观察)。 我正在探索为什么会这样。 更新2: 当我使用两个“友好的”XmlSerializer构造函数之一时,sgen’d程序集加载正常(参见上面的Update 1)。 例如,当我使用XmlSerializer(Type) ,sgen’d程序集加载并且不执行运行时codegen /编译。 但是,当我使用XmlSerializer(Type, Type[]) ,程序集不会加载。 找不到任何合理的解释。 所以我正在恢复使用其中一个受支持的构造函数和sgen’ing。 这种组合消除了我的原始问题(启动csc.exe),以及另一个相关问题(上面的Update 1中提到的XmlSerializer引起的内存泄漏)。 但是,它确实意味着我必须为派生类型(在基类型上使用XmlInclude )恢复到不太理想的序列化forms,直到框架中的某些更改来解决这种情况。

在.NET中创建插件环境的最佳方法

我读了这篇文章如何在.NET中加载插件? ,我真的没有看到微软的System.Addin命名空间的光彩。 为什么我不能在我的bin目录中有一个plugins文件夹,用户可以将程序集放入实现我设计的接口? 然后我可以使用reflection来创建插件类的实例并使用我的界面引用它。 为什么System.Addin显然要好得多? 特别是因为它似乎是工作的三倍和不太直观的设计。

WPF Sentinel对象以及如何检查内部类型

正如你们中的一些人发现的那样,一个新的特性(?)出现在WPF 4中,其中数据绑定引擎可以将名为“ {DisconnectedItem} ”的类MS.Internal.NamedObject的自定义控件实例传递给DataContext – 而不是您的代码所期望的数据项(当模板控件被其ItemsControl断开时会发生这种情况)。 这些被称为哨兵对象。 在现有代码中,这可能导致虚假exception,其中代码没有准备好。 这些可以被数据绑定子系统吞噬,或者它们可能造成严重破坏。 密切关注您的调试控制台。 无论如何,我在这个MSDN论坛上了解到了这一点 。 Sam Bent的post解释了这一切 。 现在去看看, 你会想知道这一点 。 本质上是这些事件永远不会被解雇(这就是错误),所以: 如果DataContext是sentinel对象,则忽略DataContextChanged事件。 所以,我想检查一下我的DataContext。 但是怎么样? 考虑: public bool IsSentinelObject(object dataContext) { return (dataContext is MS.Internal.NamedObject); } 猜猜会发生什么? 它没有编译,因为MS.Internal.NamedObject是内部的,我无法访问。 当然,我可以像这样破解它: public bool IsSentinelObject(object dataContext) { return dataContext.GetType().FullName == “MS.Internal.NamedObject” || dataContext.ToString() == “{DisconnectedObject}”; } (或其他东西,有效)。 我也遵循Sam的建议缓存对象以供以后引用相等性检查(它是一个单例)。 当然,这意味着我没有问题,不是真的。 但我很好奇,这篇文章肯定会让一些用户受益,所以无论如何都值得问: 有没有一种方法可以根据内部NamedObject类型精确检查类型,而无需求助于字符串比较?

如何聚焦外窗?

我有一个应用程序,一次只能打开一个自己的实例。 为了强制执行此操作,我使用以下代码: System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses(); System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess(); foreach (System.Diagnostics.Process p in myProcesses) { if (p.ProcessName == me.ProcessName) if (p.Id != me.Id) { //if already running, abort this copy. return; } } //launch the application. //… 它工作正常。 我还希望它能够集中已经运行的副本的forms。 也就是说,在返回之前,我想将此应用程序的其他实例置于前台。 我怎么做? Re:SetForeGroundWindow: SetForeGroundWindow工作到一定程度: [System.Runtime.InteropServices.DllImport(“user32.dll”)] public static extern bool SetForegroundWindow(IntPtr hWnd); //… if (p.Id != […]