Tag: clr

为什么C#不支持Protected和Internal可访问性的交集?

内部保护: 受保护和内部可访问性的结合(这比受保护或仅内部的限制更少) CLR具有受保护和内部可访问性交叉的概念,但C#不支持此function。 所以我的问题是: 省略这个访问修饰符的含义是什么,有一个具体的原因吗? 那么为什么C#不应该支持呢?

C#generics:约束T,其中T:Object不编译; 错误:约束不能是特殊类’对象’

当我约束T:对象像这样: public interface IDoWork where T : Object { T DoWork(); } 我收到错误: 约束不能是特殊类’对象’ 这是否意味着与编译的以下内容存在隐含的差异? public interface IDoWork // where T : Object { T DoWork(); }

.NET 4.5:.NET运行时内部错误(80131506)/禁用并发GC

我有一个长期运行的.NET 4.5应用程序随机崩溃,留下我在事件日志中的问题标题中提到的消息。 该问题在3个不同的机器和2个不同的系统(2008 R2和2012)上重现。 应用程序不使用任何不安全/非托管组件,它是纯托管.NET,唯一不受管理的东西是CLR本身。 这是我从转储中提取的崩溃站点的堆栈跟踪: clr.dll!MethodTable::GetCanonicalMethodTable() clr.dll!SVR::CFinalize::ScanForFinalization() – 0x1a31b bytes clr.dll!SVR::gc_heap::mark_phase() + 0x328 bytes clr.dll!SVR::gc_heap::gc1() + 0x95 bytes clr.dll!SVR::gc_heap::garbage_collect() + 0x16e bytes clr.dll!SVR::gc_heap::gc_thread_function() + 0x3e bytes clr.dll!SVR::gc_heap::gc_thread_stub() + 0x77 bytes kernel32.dll!BaseThreadInitThunk() + 0x1a bytes ntdll.dll!RtlUserThreadStart() + 0x21 bytes 这个问题与这里讨论的问题非常相似,所以我尝试了该主题中提出的解决方案,但没有一个帮助: 我已经尝试安装此修补程序,但它不会安装在我的任何机器上(KB2640103不适用,或被计算机上的其他条件阻止),这实际上是有道理的,因为我使用的是4.5,而不是4.0 。 我已经尝试禁用并发GC和/或启用服务器GC。 现在我的app.config的相关部分如下所示: 虽然奇怪的是我仍然在进程转储中找到多个与GC相关的线程。 除了发生崩溃之外,还有7个线程具有以下堆栈跟踪: ntdll.dll!NtWaitForSingleObject() + 0xa bytes KERNELBASE.dll!WaitForSingleObjectEx() + 0x9a bytes clr.dll!CLREventBase::WaitEx() […]

CLR2编译的C#COM不适用于.Net 4

有谁知道为什么在CLR2(.Net 3.5)下编译的C#创建的COM库在仅与CLR4(.Net 4)一起使用时不起作用? CLR4中缺少什么在CLR2中用于COM? 我们在app.config中使用适当的启动来使C#在CLR4 / .Net 4下运行: 所有的C#东西都有效,直到它尝试创建我们的COM接口。 它提供了以下例外: 无法加载运行时。 (HRESULTexception:0x80131700) 当我们尝试从C ++创建COM接口时,我们遇到了同样的问题。 一旦我们安装CLR2(.Net 3.5),所有COM内容开始工作。 我们想知道发生了什么。

CLR编译器优化的示例

我在几个月内就.Net性能和优化做了一个演示,我想提供一些不必要的优化样本,无论如何都要由编译器完成。 我在哪里可以找到关于编译器在代码之前和之后实际能够进行哪些优化的一些解释?

如何测试数字转换是否会改变值?

我正在执行一些数据类型转换,我需要将uint , long , ulong和decimal为IEEE 754双浮点值。 我希望能够在执行转换之前检测IEEE 754数据类型是否包含该值。 一个powershell解决方案是将一个try-catch包装在一个强制转换器周围,以便查找OverflowException 。 阅读某些CLR文档意味着某些转换只是默默地更改值而没有任何exception。 有没有任何万无一失的方法来做这个检查? 我正在寻求完整性而非易于实施。 我有一种感觉,我将仔细阅读IEEE 754规范并仔细检查matissa和exponent …… 我应该补充一点,我最关心的是准确地表示整数,浮点精度的损失是次要问题(但仍值得考虑)。 编辑: Int32能够完全表达为IEE-754。 此外, Decimal数据类型也是问题的一部分。 重要更新:如果您提到这个问题,您还应该阅读这个问题: IEEE-754双(64位浮点)与长(64位整数)重访 它注意到答案中的一个缺陷,其中一些非常大的值也能够由IEEE-754精确表示。 虽然这可能意味着该值将正确地往返,为了我的原始目的(它将往返JavaScript)它不会。 此外,CLRs System.Double类型中似乎存在一个错误,因为它不能正确地允许这些值进行往返。

Marshal.GetFunctionPointerForDelegate如何在实例成员上工作?

我想知道Marshal.GetFunctionPointerForDelegate。 即我想知道它如何将委托转换为非静态函数到函数指针。 它是否动态生成以某种方式附加实例的代码存根? 如果是这样,这不是泄密记忆吗? 也许代表在终结者中解放了它? 它看起来不像System.Delegate有一个终结器,所以我对这个机制的工作原理非常感兴趣。 我假设函数指针需要4个字节,实例需要4个字节(32位),但它返回一个简单的IntPtr。

VC ++在解决方案中从非/ clr项目的函数调用/ clr项目的函数

在提出这个问题之前我提到了这个有点类似的问题 ,但无法解决我的问题 我正在寻找一个包含许多解决方案的旧应用程序。 问题出现在其中一个解决方案中(比如说S)。 情况如下: S中的项目(比如说P1)包含所有C / C ++文件,需要调用C#函数 由于P1也包含.c文件,我不能使用/clr选项 如果我将P1中的.c文件编译为.cpp文件,那么它会产生大量错误,我不打算更改旧版.c文件中的源代码 所以我创建了另一个启用了/clr项目(比如P2),并为函数声明创建了一个头文件,为函数定义创建了一个.cpp文件; C#呼叫是在它下面进行的; P2编译好 请注意,P1是.dll,P2是作为静态库创建的; 在P1的“框架和参考”中提到了P2 和警告: 警告LNK4098:defaultlib’MSVCRT’与使用其他库冲突; 使用/ NODEFAULTLIB:库 现在有了这些,我在P1中得到3个链接器错误: 错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的“private:__thiscall type_info :: type_info(class type_info const&)”(?? 0type_info @@ AAE @ ABV0 @@ Z) 错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的“private:class type_info&__thiscall type_info :: operator =(class type_info const&)”(?? 4type_info @@ AAEAAV0 @ ABV0 @@ Z) 错误LNK1169:找到一个或多个多重定义的符号 许多在线论坛(包括本网站)都提供此错误。 但不知怎的,我在尝试这些选项后无法修复它(我是.NET框架的新手)。 重要的是,即使我从P2中删除了C#代码,也会出现相同的错误。 修复它的正确方法是什么? 更新 […]

如何在不加载.dll的情况下读取程序集清单

基本上需要以编程方式读取依赖项而不加载程序集本身,因为您无法卸载它们

如果您改变其身份,HashSets不会保持元素的唯一性

在C#中使用HashSets时,我最近遇到了一个恼人的问题: HashSets不保证元素的单一性; 它们不是套装。 他们所保证的是,当调用Add(T item)如果set item.equals(that)中的任何项为true item.equals(that)则不添加item.equals(that) 。 如果您操作集合中已有的项目,则不再存在。 一个小程序,演示(来自我的Linqpad的copypasta): void Main() { HashSet testset = new HashSet(); testset.Add(new Tester(1)); testset.Add(new Tester(2)); foreach(Tester tester in testset){ tester.Dump(); } foreach(Tester tester in testset){ tester.myint = 3; } foreach(Tester tester in testset){ tester.Dump(); } HashSet secondhashset = new HashSet(testset); foreach(Tester tester in secondhashset){ tester.Dump(); } } class […]