问题标签 [clr4.0]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 在 CLR 4.0 中,单个对象的大小仍限制为 2 GB?
据我了解,.NET 中的单个实例有 2 GB 的限制。因为到目前为止我主要在 32 位操作系统上工作,所以我没有对此给予太多关注。在 32 上,但这或多或少是人为的限制。但是,当我得知此限制也适用于 64 位 .NET 时,我感到非常惊讶。
由于诸如List<T>
使用数组来存储项目之类的集合,这意味着在 32 位上运行的 .NET 应用程序将能够在列表中保存两倍于在 64 位上运行的相同应用程序的引用类型项目。这是相当令人惊讶的 imo。
有谁知道 CLR 4.0 中是否解决了这个限制(我目前没有 4.0 安装)。
c# - .NET 4.0 和 C# 4.0 中的事件和委托逆变
在调查这个问题时,我很好奇 C# 4.0 中新的协变/逆变特性将如何影响它。
在 Beta 1 中,C# 似乎不同意 CLR。回到 C# 3.0,如果你有:
...然后在其他地方你有:
...编译器会呕吐,因为它们是不兼容的委托类型。但在 C# 4.0 中,它编译得很好,因为在 CLR 4.0 中,类型参数现在被标记为in
,所以它是逆变的,因此编译器假定多播委托+=
可以工作。
这是我的测试:
但是尽管它可以编译,但它在运行时不起作用(ArgumentException
: Delegates 必须是相同的类型)。
如果您只添加两种委托类型中的任何一种,就可以了。但是多播中两种不同类型的组合在添加第二种时会导致异常。
我想这是 beta 1 中的 CLR 中的一个错误(编译器的行为看起来是正确的)。
发布候选更新:
上面的代码不再编译。一定是委托类型中的逆变性TEventArgs
已经EventHandler<TEventArgs>
回滚,所以现在委托与.NET 3.5中的定义相同。
也就是说,我查看的测试版一定有:
现在又回到了:
但是Action<T>
委托参数T
仍然是逆变的:
Func<T>
' 的T
协变也是如此。
只要我们假设多播委托的主要用途是在事件的上下文中,这种妥协就很有意义。我个人发现我从不使用多播委托,除非作为事件。
所以我猜 C# 编码标准现在可以采用一个新规则:不要从通过协变/逆变相关的多个委托类型形成多播委托。如果您不知道这意味着什么,请避免使用Action
for 事件以确保安全。
当然,这个结论对最初的问题有影响,这个问题源于......
.net - 我们可以构造一个 `OpCode` 的实例吗?
.NET Framework 4.0 为反射 API 引入了几个项目,这些项目从非常有用到对我的工作至关重要。其中包括Assembly
、Module
、MethodBody
和LocalVariableInfo
以及新CustomAttributeData
类的受保护构造函数。我仍然需要一些很难解决的项目。我相信它们很容易适用于需要扩展我刚刚列出的类型的同一 [小] 群体。
这一次:我正在寻找一种方法来System.Reflection.Emit.OpCode
用我自己的参数构造一个结构实例。我目前调用内部构造函数来创建实例。这对性能没有不利影响,因为我将构建的项目公开为public static readonly
类的成员以供重用,但正如您可以想象的那样,这是一个非常次优的场景。
是否有任何理由无法通过OpCode
说明用户构造OpCode
的 s 不能与ILGenerator
.
编辑:这是一个例子。通过创建以下自定义操作码,我可以在一些中间指令列表之间的字节码转换中使用它,而无需创建临时局部变量。如果我发出 IL,我会将剩余的swap
指令转换为有效的 IL 表示,但在我的情况下,下一步是理解自定义swap
指令的 JIT。我正在使用Prefix2
prefix 0xFD
,它被任何有效的 IL 操作码保留和使用。
我还将将此用于没有简单/通用托管代码表示但在各种本机代码生成器中可用的简单平台相关表示的 JIT 内在函数。其中之一是ldthread
(加载对当前托管线程RuntimeThread
表示的引用)。
c# - 是否有为 CLR 版本定义的 ac# 预编译器
我需要通过 CLR 版本有条件地编译代码。
例如,有一段代码我只需要在 CLR 2 (.NET 3.5 VS2008) 中编译,而不需要在 CLR 4 (.NET 4 VS2010)
中编译 是否有可以在#if 子句中使用的当前 CLR 版本的预编译器指令?
谢谢。
.net - 启用 useLegacyV2RuntimeActivationPolicy 的影响?
对于我当前的项目,我们正在使用一些基于 CLR 2 的混合模式程序集。
为了在 .NET 4 目标程序集中使用这些,我知道您必须添加useLegacyV2RuntimeActivationPolicy=true
到<startup>
app.config 中的元素。
我了解这会更改激活策略,导致使用受支持的最高 CLR 版本加载这些混合模式程序集。
但是,这样做有什么副作用吗?启用非默认激活策略时应注意哪些潜在问题?
.net-4.0 - 在 CLR 4.0 中加载/执行 CLR 2.0 程序集
CLR 4.0 是否可以在不需要重新编译源代码的情况下执行 CLR 2.0 IL?
.net - .NET 4 GC 触发收集的已知阈值?
我知道 GC 触发的逻辑并不简单,但它有一定的阈值需要监控。
任何人都知道 .NET 4 工作站和服务器 GC 的这些阈值是多少?
谢谢
c# - HyperDescriptor 在 .NET 4 中构建时可以工作吗?
我正在开发一个 .NET 4 项目,并且可以从HyperDescriptor提供的动态属性访问中受益,但是在 .NET 4 中构建时它似乎无法正常工作。我从 CodeProject 下载了源代码,将解决方案项目转换为VS2010,并将目标框架更新为4.0。虽然它构建并且示例正确执行,但时间显示使用 HyperDescriptor 访问动态属性是获取/设置对象值的最慢方法。
仅当您使用 .NET 4 从源代码构建 HyperDescriptor 时才会出现此问题。如果从您的 .NET 4 项目中添加对使用 .NET 2 构建的 HyperDescriptor 的引用,它可以正常工作。目前这是一个可以接受的解决方案,但使用 .NET 4 构建会有一些潜在优势吗?任何人都想尝试一下 HyperDescriptor,看看为什么 .NET 4 构建速度如此之慢?
c# - 如何使用 ExpressionType.Index 的 NodeType 创建一个 .NET 表达式?
我正在编写评估 .NETExpression
树的代码。我正在尝试创建一个 C# 4 测试来练习我对 的处理ExpressionType.Index
,但我不知道如何通过LambdaExpression
. 无论我尝试什么,表达式都会以ExpressionType.Call
or形式出现ExpressionType.ArrayIndex
。例如:
什么是IndexExpression
, 可以通过LambdaExpression
C# 4 中的内联创建吗?
.net - .Net 对象生命周期\生命周期与非托管代码
我试图了解如何在 .Net 世界中创建对象,而不是在非托管代码环境(VB6 等)中创建对象
据我了解,当使用新的 keyowrd 在 C# 中创建对象时,引用变量被放置在托管堆中,直到垃圾收集器采取主动措施来检查对象是否仍然具有对它的引用。如果没有,它就会被销毁。这是否意味着 GC 一直在运行?这不是一个昂贵的过程吗?
有人可以解释得更好吗?
这在无人管理的代码环境中有何不同?