clr相关内容
我有一个需要快速性能的程序.在它的一个内部循环中,我需要测试一个对象的类型,看它是否继承自某个接口. 一种方法是使用 CLR 的内置类型检查功能.最优雅的方法可能是“is"关键字: if (obj is ISpecialType) 另一种方法是为基类提供我自己的虚拟 GetType() 函数,该函数返回一个预定义的枚举值(在我的情况下,实际上,我只需要一个 bool).这种方法会很快,但
..
我只是在修改 C# 中处理可空类型的第 4 章,我正在添加一个关于使用“as"运算符的部分,它允许您编写: object o = ...;内部?x = o 作为 int?;如果(x.HasValue){...//在这里使用 x.Value} 我认为这真的很巧妙,它可以提高 C# 1 等效项的性能,使用“is"后跟强制转换 - 毕竟,这样我们只需要请求一次动态类型检查,然后简单的值检查.
..
C# 不允许编写非成员函数,每个方法都应该是类的一部分.我认为这是所有 CLI 语言的限制.但是我错了,我发现 C++/CLI 支持非成员函数.编译时,编译器会将该方法作为某个未命名类的成员. 这是 C++/CLI 标准所说的, [注意:CLI 将非成员函数视为某个未命名类的成员;但是,在 C++/CLI 源代码中,不能使用该类名显式限定此类函数.尾注] 未指定元数据中非成员函数
..
我一直被可怕的 OnUserPreferenceChanged Hang 所困扰,Ivan Krivyakov 在这里很好地提到了它: http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance 我在不久前发布了一个问题,当我最初遇到这个问题时: 又一个 C# 死锁调试问题 我以为我已经
..
我找到了一种直接从 VBA 代码调用 .NET 2 代码的方法: 将 clr 变暗为 mscoree.CorRuntimeHost设置 clr = 新 mscoree.CorRuntimeHost启动Dim 域作为 mscorlib.AppDomainclr.GetDefaultDomain 域Dim myInstanceOfDotNetClass 作为对象设置 myInstanceOfDotN
..
我已阅读有关代和大对象堆的信息.但我还是不明白拥有大对象堆的意义(或好处)是什么? 如果 CLR 仅依靠第 2 代(考虑到 Gen0 和 Gen1 的阈值很小,无法处理大对象)来存储大对象,会出现什么问题(在性能或内存方面)? 解决方案 垃圾回收不仅清除未引用的对象,还压缩堆.这是一个非常重要的优化.它不仅使内存使用更高效(没有未使用的漏洞),它还使 CPU 缓存更高效.缓存在现代处
..
C# 不允许结构派生自类,但所有 ValueType 派生自 Object.这种区别在哪里? CLR 如何处理这个问题? 解决方案 C# 不允许从类派生结构体 您的陈述不正确,因此您感到困惑.C#确实允许从类派生结构.所有结构都派生自同一个类 System.ValueType,后者派生自 System.Object.并且所有枚举都源自 System.Enum. 更新:
..
String 是一种引用类型,尽管它具有值类型的大部分特征,例如不可变和 == 重载以比较文本而不是确保它们引用相同的对象. 那为什么字符串不只是一种值类型? 解决方案 字符串不是值类型,因为它们可能很大,并且需要存储在堆中.值类型(在迄今为止的所有 CLR 实现中)存储在堆栈中.堆栈分配字符串会破坏各种事情:堆栈只有 1MB 用于 32 位和 4MB 用于 64 位,您必须将每个字
..
在编写接口时,我发现我在做很多强制转换或对象类型转换. 这两种转换方式有区别吗?如果是,是否存在费用差异或这对我的计划有何影响? 公共接口 IMyInterface{void AMethod();}公共类 MyClass : IMyInterface{公共无效 AMethod(){//做工作}//其他辅助方法....}公共类实现{IMyInterface _MyObj;MyClass _m
..
我刚刚开始我的第一个 C++ 项目.我正在使用 Visual Studio 2008.它是一个单一形式的 Windows 应用程序,它访问几个数据库并启动一个 WebSphere MQ 事务.我基本上了解 ATL、MFC、Win32(实际上我对那个有点模糊)和 CLR 之间的区别,但我不知道应该如何选择. 其中一个或多个是否只是为了向后兼容? CLR 一个坏主意吗? 感谢任何建议
..
在 .NET 中,“平台目标:任何 CPU"编译器选项允许 .NET 程序集在 x64 机器上以 64 位运行,在 x86 机器上以 32 位运行.还可以使用“平台目标:x86"编译器选项强制程序集在 x64 机器上作为 x86 运行. 是否可以运行带有“Any CPU"标志的程序集,但要确定它应该在 x86 还是 x64 CLR 中运行?通常这个决定是由 CLR/OS 加载器(根据我的理解
..
微软选择在 .NET Core 中不支持 AppDomains 是否有充分的理由? AppDomains 在构建长时间运行的服务器应用程序时特别有用,我们可能希望在不关闭服务器的情况下以一种优雅的方式更新服务器加载的程序集. 如果没有 AppDomains,我们将如何在长时间运行的服务器进程中替换我们的程序集? AppDomains 还为我们提供了一种隔离服务器代码不同部分的方法
..
我曾经认为已签名和/或强命名的 .net 程序集在加载时由 CLR 验证,这意味着某人不可能编辑 IL 并且仍然拥有有效的程序集.然后我听了这个很棒的牧群代码播客Jon McCoy 说这并没有真正发生(在播客中大约 12:47) - 即任何人都可以编辑 IL 并弄乱您的程序集,而 CLR 不会关心.我知道这听起来很奇怪,但他似乎知道他在说什么,所以也许只是我不知道他指的是什么场景. 有人可以
..
我创建了使用 CLR 触发器连接到 WCF 服务器并通知它有关数据库更改的系统.它在 SQL Server 2008 R2 上运行正常.现在我正在尝试在 SQL Server 2012 上进行迁移.要使用 WCF,我需要加载 SMDiagnostics.dll 程序集以及其他程序集.我检查了 clr 在 db 中启用,并将 trustworthy 设置为“on",我禁用了 WCF 调试,我检查了
..
假设我有一个 AppDomain.AssemblyResolve 事件,并在处理程序中构造一个字节数组并调用方法 Assembly.Load(字节[]).此方法本身是否会导致 AssemblyResolve 事件再次引发,并导致我的处理程序重新进入? 我的问题不仅限于可以使用 C# 编译器生成的程序集,它们还可以包含 CLR 支持的 abritrary 元数据和可执行代码. 我做了一些
..
在 公共语言运行时(CLR) Microsoft 页面,它说 .Net Framework 4 和 4.5 都使用 CLR 版本 4. 但是在此页面中 (.NET Framework 版本和依赖项)它写道“.Net Framework 4.5 版包括 CLR 4 的更新版本" 还写道: '针对 .NET Framework 4.5.1 的可执行文件将被阻止在仅安装了 .NET F
..
我有兴趣查看 C# 程序(不是 CLR 字节码指令)的实际 x86 程序集输出.有什么好的办法吗? 解决方案 您应该将 WinDbg 与 SOS/SOSEX 一起使用,确保您要查看 x86 代码的方法在方法表中进行了 JIT,然后使用 查看实际反汇编u 命令.这样你就会看到实际的代码. 正如这里其他人提到的,使用 ngen 您可以看到与实际 JIT 编译结果不完全匹配的代码.使用 V
..
在过去,并非每个新版本的 .NET 都带有新版本的 CLR.我知道 .NET 1.0、1.1、2.0 和 4.0 有,但 .NET 3.0 和 3.5 没有. .NET 4.5 会引入新的 CLR 吗?如何判断是否有新的 CLR? 解决方案 是的,.NET 4.5 有一个全新的 CLR 版本,您可以在以下位置阅读有关改进的信息; http://blogs.microsoft.c
..
我从 http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27541,它“替代"了 .NET 4.0 版本. 但是,检测 .NET 框架版本的旧方法似乎返回 4.0(在我的 PC 上更准确地说是 4.0.30319.17020),而不是 4.5(当然可能是为了向后兼容,或者?): 使用系统;命名空间控制台应
..
我们的应用程序是使用 VS 2008 构建的,使用 Linq 并将目标框架设置为 .NET Framework3.5. 当机器上只安装了 .NET 3.5 或 4 时它工作正常. 但是,在安装了 .NET 2(或 3.0)和 .NET 4 的机器上,应用程序加载了 .NET 2,并在访问 Linq 时崩溃,因为它会查找 .NET 3.5 库. 在 app.config 中使用标记
..