问题标签 [typeinitializer]

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.

0 投票
2 回答
193 浏览

c# - HttpRuntime..cctor 需要永远执行

死的简单代码:

而且我已经等待输出超过 5 分钟。这个问题大约在一周前开始出现(可能会更少),另外三台计算机(我同事的盒子)经历了相同的行为,除了其中一些设法HttpRuntime在一分钟内完成初始化,这仍然很奇怪。

有人经历过吗?我该怎么办?

0 投票
1 回答
12840 浏览

c# - 构造函数中的 try/catch 块

在构造函数中使用 try/catch 块是一种不好的编程习惯吗?还是只要我们的程序优雅地处理 typeinitializer 异常就没有区别。

在 C# 中,如果构造函数中有任何异常,框架总是会抛出 typeinitilizer 异常。

谢谢, 沙米卡

0 投票
7 回答
1862 浏览

c# - 为什么 CLR 不总是调用值类型构造函数

我有一个关于Value type 中的类型构造函数的问题。这个问题的灵感来自 Jeffrey Richter 通过 C# 第 3 版在 CLR 中编写的内容,他说(在第 195 页 - 第 8 章)您永远不应该在值类型中实际定义类型构造函数,因为有时 CLR 不会调用它。

因此,例如(嗯......实际上是 Jeffrey Richters 的例子),即使通过查看 IL,我也无法弄清楚为什么在以下代码中没有调用类型构造函数:

因此,将以下规则应用于类型构造函数,我只是看不出为什么根本不调用上面的值类型构造函数。

  1. 我可以定义一个静态值类型构造函数来设置类型的初始状态。
  2. 一种类型只能有一个构造函数——没有默认构造函数。
  3. 类型构造函数是隐式私有的
  4. JIT 编译器检查该类型的类型构造函数是否已在此 AppDomain 中执行。如果不是,它将调用发送到本机代码,否则它不会因为它知道类型已经“初始化”。

所以......我只是无法弄清楚为什么我看不到正在构造的这种类型数组。

我最好的猜测是它可能是:

  1. CLR 构造类型数组的方式。我原以为创建第一个项目时会调用静态构造函数
  2. 构造函数中的代码未初始化任何静态字段,因此被忽略。我已经尝试在构造函数中初始化私有静态字段,但该字段仍然是默认的 0 值 - 因此不调用构造函数。
  3. 或者......由于设置了公共 Int32,编译器以某种方式优化了构造函数调用 - 但这充其量只是一个模糊的猜测!

除了最佳实践等,我只是对它非常感兴趣,因为我希望自己能够看到为什么它没有被调用。

编辑:我在下面添加了对我自己的问题的答案,只是引用了 Jeffrey Richter 所说的话。

如果有人有任何想法,那就太好了。非常感谢,詹姆斯

0 投票
2 回答
3345 浏览

c# - 强制类加载

C# 或 .net IL 中是否有办法强制具有类型初始值设定项(静态构造函数)的类加载自身,而不访问其任何参数?

假设我有课

有没有办法让这条线打印?

请注意,该类是静态的,因此我无法实例化它来强制初始化,并且它没有公共成员,因此我无法访问它们来启动它。

0 投票
2 回答
1741 浏览

c# - 如何显式运行未知类型的静态构造函数?

可能重复:
如何使用反射调用静态构造函数?

我在各种类的静态构造函数中有一些初始化代码。我无法创建实例,也无法提前知道类型。我想确保加载类。

我试过这个:

但是得到了 MemberAccessException: Type initializer was not callable。

我假设这是因为 cctor 是私人的?有没有办法在不改变架构的情况下解决这个问题?

编辑:我找到了一种使用 的解决方法RuntimeHelpers.RunClassConstructor,但这种方式似乎在 MSDN 中几乎没有记录,我不确定它是黑客还是合理的产品系统之类的方式。

0 投票
0 回答
1426 浏览

exception - System.Data.OracleClient.OracleConnection 引发类型初始化程序异常

我想就我面临的问题寻求帮助。我在一个网站上运行了一个很长的任务。因为处理任务需要一些时间,所以我决定改变结构。不久,现在我正在从网站调用一个 exe 并监视该过程。在我的开发环境中一切都很好。但是当我尝试在我的 prod 环境中运行 exe 时,我收到以下异常消息。我使用 System.Data.OracleClient 连接到 Oracle 数据库。

当我从网站调用 exe 时会发生这种情况。我创建了一个 winforms 应用程序来测试 exe。如果我从我的 winforms 应用程序调用 exe(与我从网站调用的方式相同),一切正常。

我在网上搜索了异常。我发现了 2 条建议。

1-) 不同版本的 Oracle 客户端:这就是我创建测试 winforms 应用程序的原因。它运行得很好。因此,除非我遗漏了什么,否则我认为 Oracle 客户端不是问题。

2-) 32 位/64 位操作系统问题:我最初编译了针对 32 位环境的 exe。我的产品环境是 64 位的。所以我尝试编译目标 64 位,但得到了同样的异常。另外,我的 winforms 测试应用程序运行 32 位 exe 没有任何问题。我的开发环境也是 64 位的,但我没有得到例外。

任何想法将不胜感激...


编辑:我找不到类型初始化程序异常的解决方案。其实我没有时间深入研究它。所以我所做的是调用一个winforms exe并模拟它的按钮点击来调用实际的exe。我不喜欢这个解决方案,但我不得不继续前进。我不再收到OracleConnection异常。

0 投票
6 回答
108 浏览

c# - 在类型初始化器中实例化一个 List

说我有一个struct这样的

struct使用以下方法实例化它:

我想知道如何添加一个foreach循环来将详细信息添加到Details属性中,而不是这样做:

这甚至可能吗?我梦想着代码奢华吗?

0 投票
2 回答
8267 浏览

.net - 为什么查找类型的初始化程序会引发 NullReferenceException?

这让我很难过。我试图优化 Noda Time 的一些测试,我们有一些类型初始化程序检查。我想在所有内容加载到新的AppDomain. 令我惊讶的是,尽管我的代码NullReferenceException中没有空值,但对此进行了一个小测试。它在没有调试信息的情况下编译时抛出异常。

这是一个简短但完整的程序来演示该问题:

以及编译和输出的成绩单:

现在您会注意到我正在使用 .NET 4.5(候选发布版)——这可能与此处相关。用其他各种原始框架(特别是“vanilla”.NET 4)测试它对我来说有点棘手,但如果其他人可以轻松访问具有其他框架的机器,我会对结果感兴趣。

其他详情:

  • 我在 x64 机器上,但 x86 和 x64 程序集都会出现此问题
  • 调用代码的“调试性”会有所不同——尽管在上面的测试用例中它是在自己的程序集中对其进行测试,但当我针对 Noda Time 进行尝试时,我不必重新编译NodaTime.dll即可看到差异——只是Test.cs其中提到了它。
  • 在 Mono 2.10.8 上运行“损坏”程序集不会抛出

有任何想法吗?框架错误?

编辑:好奇和好奇。如果您Console.WriteLine拨打电话:

它现在在使用csc /o- /debug-. 如果您打开优化, ( /o+) 它会起作用。但是,如果您Console.WriteLine按照原始版本包含调用,则两个版本都将失败。

0 投票
1 回答
94 浏览

c#-4.0 - 在类型初始化程序中分配与其父值相同的子值

我有一堂课

在这里,我有一个属性儿童列表。

现在我正在使用类型初始化器创建此类实例的数组

所以,我的问题是我正在创建一个 Person 的对象,我在其中分配了它的 Address 属性,现在我希望这个属性值分配它的子级,但是我没有找到一种方法来获取它的父级,就像我们通过这个关键字所做的那样在其定义中获取类成员。

0 投票
1 回答
56 浏览

java - 在不读取类文件的情况下找出类是否具有类初始化器

我想知道是否有一种已知的方法可以找出加载Class的是否具有类初始化程序,即使用<clinit>方法编译。我知道此方法不可见或无法通过反射调用,但我想在应用一些转换时复制加载的类。

我想避免解析类文件,因为我重新定义了这个类的所有方法,这实际上意味着我不需要文件中的任何信息,因为与我相关的所有信息都可以从加载的Class.

因此我的问题是:是否可以检查已加载Class的类初始化程序是否存在?