Tag: clr

如何实现虚拟generics方法调用?

我对CLR如何实现这样的调用感兴趣: abstract class A { public abstract void Foo(); } A a = … a.Foo(); // <=== ? 这个调用会导致某种类型的哈希映射查找类型参数令牌作为键和编译的generics方法专门化(一个用于所有引用类型,所有值类型的不同代码)作为值?

在C#中使用foreach循环时的内存分配

我知道关于foreach循环如何在C#中工作的基础知识( foreach循环如何在C#中工作 ) 我想知道是否使用foreach分配可能导致垃圾收集的内存? (适用于所有内置的系统类型)。 例如,在System.Collections.Generic.List类上使用Reflector,这里是GetEnumerator的实现: public Enumerator GetEnumerator() { return new Enumerator((List) this); } 在每次使用时,这会分配一个新的枚举器(以及更多的垃圾)。 所有类型都这样做吗? 如果是这样,为什么? (不能重用一个枚举器吗?)

threadpool是否在应用程序域之间共享?

考虑一个创建多个应用程序域的过程。 这些应用程序域是否共享相同的线程池? 如果是,它如何在多个应用程序域之间协调?

使用CLR返回表

我想编写一个CLR过程,它接受一个文本并返回一个包含本文所有单词的表。 但我无法弄清楚如何返回一张桌子。 你能告诉我吗? [Microsoft.SqlServer.Server.SqlFunction] public static WhatTypeShouldIWriteHere Function1(SqlString str) { string[] words = Regex.Split(str, @”\W+”).Distinct().ToArray(); //how to return a table with one column of words? } 谢谢您的帮助。 更新:我需要为sql-2005做这件事

我的32位头痛现在是64位偏头痛?!? (或64位.NET CLR运行时问题)

在64位JIT和32位JIT下运行.NET应用程序时,在性能,内存等方面出现了什么exception的意外后果? 我对好事感兴趣,但对人们遇到的令人惊讶的糟糕问题更感兴趣。 我正在编写一个新的.NET应用程序,它将部署在32位和64位。 关于移植应用程序的问题有很多问题 – 我不关心编程/移植角度的“陷阱” 。 (即:正确处理本机/ COM互操作,嵌入在结构中的引用类型,改变结构的大小等) 然而, 这个问题及其答案让我思考 – 我还有什么其他问题可以忽略? 有很多问题和博客文章绕过这个问题,或者涉及到它的一个方面,但我还没有看到任何编制了一个很好的问题清单。 特别是 – 我的应用程序非常受CPU限制并且具有巨大的内存使用模式(因此首先需要64位),以及本质上是图形化的。 我关心在64位Windows上运行的CLR或JIT中可能存在的其他隐藏问题(使用.NET 3.5sp1)。 以下是我目前了解的一些问题: ( 现在我知道了 )属性,甚至自动属性,都没有在x64中内联。 由于引用的大小,应用程序的内存配置文件也会更改,但也因为内存分配器具有不同的性能特征 启动时间可能会受到x64的影响 我想知道人们在64位Windows上的JIT中发现了哪些其他具体问题,以及是否有任何性能方面的解决方法。 谢谢你们! – – 编辑 – – – 只是为了澄清 – 我知道尽早尝试优化通常很糟糕。 我知道第二次猜测系统往往很糟糕。 我也知道64bit的可移植性有其自身的问题 – 我们每天在64位系统上运行和测试以帮助解决这个问题。 等等 但是,我的应用程序不是您典型的业务应用程序。 这是一个科学的软件应用程序。 我们有许多流程可以在所有核心(高度线程化)上使用100%CPU,每次数小时。 我花了很多时间来分析应用程序,这会产生很大的不同。 但是,大多数分析器都会禁用JIT的许多function,因此当您在分析器下运行时,内存分配,JIT中的内联等小细节可能很难确定。 因此我需要这个问题。

任何人都可以给我一个很好的理由在代码中使用CLR类型名称而不是C#类型名称(别名)(作为一般做法)?

我们的开发团队正在进行一场战斗。 我很想听听其他人对此的看法。

与generics参数的接口与使用generics方法的接口

假设我有这样的界面和具体实现 public interface IMyInterface { T My(); } public class MyConcrete : IMyInterface { public string My() { return string.Empty; } } 所以我为strings创建MyConcrete实现,我可以为int提供一个更具体的实现。 那没关系。 但是,让我们说,我想做同样的事情,但使用通用方法,所以我有 public interface IMyInterface2 { T My(); } public class MyConcrete2 : IMyInterface2 { public string My() { throw new NotImplementedException(); } } 所以我有相同的IMyInterface2 ,但它通过T My()定义了通用行为。 在我的具体类中,我想实现My行为,但对于具体的数据类型 – string 。 但C#不允许我这样做。 […]

为什么静态类被认为是“类”和“引用类型”?

我今天一直在思考C#和CIL类型系统,我开始想知道为什么静态类被认为是类。 有很多方法它们不是真正的类: “普通”类可以包含非静态成员,静态类则不能。 在这方面,类比结构更类似于静态类,但结构具有单独的名称。 您可以引用“普通”类的实例,但不能引用静态类(尽管它被视为“引用类型”)。 在这方面,类比接口更类似于静态类,但接口具有单独的名称。 静态类的名称永远不能在类型名称通常适合的任何地方使用:您不能声明此类型的变量,您不能将其用作基类型,并且您不能使用它作为generics类型参数。 在这方面,静态类更像名称空间 。 “普通”类可以实现接口。 再次,这使得类更接近结构而不是静态类。 “普通”类可以从另一个类inheritance。 将静态类视为从System.Object派生也是奇怪的。 虽然这允许它们“inheritance”静态方法Equals和ReferenceEquals ,但是inheritance的目的是有问题的,因为无论如何你都会在对象上调用这些方法。 C#甚至允许您在静态类上明确指定无用inheritance,但不能在接口或结构上指定无用inheritance,其中对象和System.ValueType的隐式派生分别实际上有用 。 关于features-of-features参数:静态类具有类的特征的子集,但它们也具有结构特征的子集。 所有使类与其他类型不同的东西似乎都不适用于静态类。 关于typeof参数:将静态类转换为新的不同类型并不妨碍它在typeof中使用 。 鉴于静态类的纯粹奇怪性,以及它们与“普通”类之间的相似性的稀缺性,它们是不是应该被制成一种单独的类型而不是一种特殊的类?

你如何使用技术(描述)来处理.Net的C结构和指针?

你如何使用这里描述的技术来处理.Net的C结构? 当然,我需要一个代码示例 – 分3部分:C声明部分,C ++包装C和C#acsessing。 所以我想知道的是 C结构体A具有其参数结构B之一,其由至少2种类型组成,其中一种是指向应声明的某些变量C的指针。 我们想要从C#.Net访问所有A和B结构及其参数和变量C. 怎么办这样的事?

nativeGetUninitializedObject实际存在于何处?

我对一些序列化的东西感到好奇,所以我去了FormatterServices ,发现了一个名为nativeGetUninitializedObject的方法,它实际上处理给定类型的初始化(不调用custructor)。 此方法使用extern关键字和以下属性进行修饰: [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical] 我想知道:这种方法实际存在于何处? CLR调用什么代码来获取给定类型的初始化(不调用构造函数)?