标签: clr

C#中的堆栈容量

有人能告诉我C#中的堆栈容量是多少.

我正在尝试使用30,000个项目的数组形成3D网格闭合对象.

.net c# clr stack

49
推荐指数
5
解决办法
4万
查看次数

你有没有用过ngen.exe?

这里有人曾经使用过ngen吗?哪里?为什么?是否有任何性能提升?何时何地使用它有意义?

.net c# clr optimization ngen

47
推荐指数
4
解决办法
2万
查看次数

MarshalByRefObject特别吗?

.NET有一个称为远程处理的东西,你可以在不同的应用程序域甚至物理机器之间传递对象.我不完全理解魔法是如何完成的,因此这个问题.

在远程处理中,有两种传递对象的基本方法 - 它们可以被序列化(转换为一堆字节并在另一端重建)或者它们可以从MarshalByRefObject继承,在这种情况下.NET会生成一些透明代理,所有这些都是方法调用被转发回原始实例.

这非常酷,就像魔法一样.而且我不喜欢编程中的魔法.纵观MarshalByRefObject与反射我看不到任何会使其有别于任何其他典型的对象.甚至不是一个奇怪的内部属性或任何东西.那么整个透明代理事件是如何组织起来的呢?我可以自己制作这样的机制吗?我可以制作一个MyMarshalByRefObject不会继承的替代品,MarshalByRefObject但仍会采取相同的行动吗?或者正在MarshalByRefObject接受.NET引擎本身的一些特殊处理,整个远程专长是不可复制的?

.net clr remoting

47
推荐指数
1
解决办法
9991
查看次数

如何检测正在使用的.NET运行时(MS与Mono)?

我想知道在程序执行期间是使用Mono运行时还是Microsoft运行时执行它.

我目前正在使用以下代码来确定我是否在使用MS CLR:

static bool IsMicrosoftCLR()
{
    return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
}
Run Code Online (Sandbox Code Playgroud)

但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装.

有没有更好的方法来检查当前的运行时?

c# clr mono

46
推荐指数
5
解决办法
1万
查看次数

.NET JIT编译的代码在哪里缓存?

.NET程序首先编译为MSIL代码.执行时,JIT编译器会将其编译为本机机器代码.

我想知道:

这些JIT编译的机器代码存储在哪里?它只存储在进程的地址空间中吗?但是由于程序的第二次启动比第一次快得多,我认为即使在执行完成之后,这个本机代码也必须存储在磁盘上.但是哪里?

.net c# clr jit

46
推荐指数
3
解决办法
1万
查看次数

.NET中类等级的加载器

有谁知道是否可以在.NET中定义"java自定义类加载器"的等价物?

给一点背景:

我正在开发一种针对CLR的新编程语言,称为"Liberty".该语言的一个特性是它能够定义"类型构造函数",它是编译器在编译时执行并生成类型作为输出的方法.它们是泛型的泛化(该语言确实具有普通泛型),并允许编写这样的代码(使用"Liberty"语法):

var t as tuple<i as int, j as int, k as int>;
t.i = 2;
t.j = 4;
t.k = 5;
Run Code Online (Sandbox Code Playgroud)

"tuple"的定义如下:

public type tuple(params variables as VariableDeclaration[]) as TypeDeclaration
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

在这个特定的例子中,类型构造函数tuple提供类似于VB和C#中的匿名类型.

但是,与匿名类型不同,"元组"具有名称,可以在公共方法签名中使用.

这意味着我需要一种方法,最终由编译器发出的类型可以跨多个程序集共享.例如,我想要

tuple<x as int>在程序集A中定义的最终类型与tuple<x as int>程序集B中定义的类型相同.

当然,问题是程序集A和程序集B将在不同的时间进行编译,这意味着它们最终都会发出自己不兼容的元组类型版本.

我考虑使用某种"类型擦除"来做这个,所以我会有一个像这样的一堆类型的共享库(这是"Liberty"语法):

class tuple<T>
{
    public Field1 as T;
}

class tuple<T, R>
{
    public Field2 as T;
    public Field2 as R;
}
Run Code Online (Sandbox Code Playgroud)

然后只重定向来自第i,j和k元组字段来访问Field1,Field2Field3.

然而,这不是一个真正可行的选择.这意味着,在编译时 …

.net compiler-construction clr language-features programming-languages

44
推荐指数
1
解决办法
1万
查看次数

x64上的sizeof(int)?

当我sizeof(int)在C#.NET项目中执行时,返回值为4.我将项目类型设置为x64,那为什么它会说4而不是8?这是因为我正在运行托管代码吗?

c# clr 64-bit sizeof

44
推荐指数
6
解决办法
3万
查看次数

.NET CLR是否真的针对当前处理器进行了优化

当我读到有关C#或Java等JITted语言的性能时,作者通常会说它们理论上应该/可以胜过许多本机编译的应用程序.理论上,本机应用程序通常只是为处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能并非真正在所有处理器上进行优化.另一方面,CLR可以在JIT过程中进行特定于处理器的优化.

有谁知道微软(或Mono)的CLR在JIT过程中是否实际执行特定于处理器的优化?如果是这样,有什么样的优化?

.net c# clr optimization jit

44
推荐指数
2
解决办法
2988
查看次数

奇怪的铸造行为.无法将object(int)强制转换为long

我有以下代码:

int intNumber1 = 100;
object intNumber2 = 100;
bool areNumberOfTheSameType = intNumber1.GetType() == intNumber2.GetType(); // TRUE
bool areEqual = intNumber1.Equals(intNumber2); // TRUE

long longNumber1 = (long) intNumber1; // OK
long longNumber2 = (long) intNumber2; // InvalidCastException. Why?
Run Code Online (Sandbox Code Playgroud)

为什么第二次演员不工作?我意识到这可能是因为对象没有显式转换为long,但如果我们在运行时查看它的类型就是System.Int32.

如果我使用vardynamic代替object,它的工作原理.

有什么想法吗?

.net c# clr

44
推荐指数
2
解决办法
3万
查看次数

在一个开关vs字典中的Func值,这更快,为什么?

假设有以下代码:

private static int DoSwitch(string arg)
{
    switch (arg)
    {
        case "a": return 0;
        case "b": return 1;
        case "c": return 2;
        case "d": return 3;
    }
    return -1;
}

private static Dictionary<string, Func<int>> dict = new Dictionary<string, Func<int>>
    {
        {"a", () => 0 },
        {"b", () => 1 },
        {"c", () => 2 },
        {"d", () => 3 },
    };

private static int DoDictionary(string arg)
{
    return dict[arg]();
}
Run Code Online (Sandbox Code Playgroud)

通过迭代这两种方法并进行比较,即使"a","b","c","d"扩展为包含更多键,我也会得到字典稍快一些.为什么会这样?

这与圈复杂度有关吗?是因为抖动只将字典中的return语句编译为本机代码一次?是因为字典的查找是O(1),这可能不是switch语句的情况?(这些只是猜测)

c# clr dictionary cyclomatic-complexity switch-statement

43
推荐指数
3
解决办法
2万
查看次数