这里有人曾经使用过ngen吗?哪里?为什么?是否有任何性能提升?何时何地使用它有意义?
.NET有一个称为远程处理的东西,你可以在不同的应用程序域甚至物理机器之间传递对象.我不完全理解魔法是如何完成的,因此这个问题.
在远程处理中,有两种传递对象的基本方法 - 它们可以被序列化(转换为一堆字节并在另一端重建)或者它们可以从MarshalByRefObject继承,在这种情况下.NET会生成一些透明代理,所有这些都是方法调用被转发回原始实例.
这非常酷,就像魔法一样.而且我不喜欢编程中的魔法.纵观MarshalByRefObject与反射我看不到任何会使其有别于任何其他典型的对象.甚至不是一个奇怪的内部属性或任何东西.那么整个透明代理事件是如何组织起来的呢?我可以自己制作这样的机制吗?我可以制作一个MyMarshalByRefObject不会继承的替代品,MarshalByRefObject但仍会采取相同的行动吗?或者正在MarshalByRefObject接受.NET引擎本身的一些特殊处理,整个远程专长是不可复制的?
我想知道在程序执行期间是使用Mono运行时还是Microsoft运行时执行它.
我目前正在使用以下代码来确定我是否在使用MS CLR:
static bool IsMicrosoftCLR()
{
return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
}
Run Code Online (Sandbox Code Playgroud)
但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装.
有没有更好的方法来检查当前的运行时?
.NET程序首先编译为MSIL代码.执行时,JIT编译器会将其编译为本机机器代码.
我想知道:
这些JIT编译的机器代码存储在哪里?它只存储在进程的地址空间中吗?但是由于程序的第二次启动比第一次快得多,我认为即使在执行完成之后,这个本机代码也必须存储在磁盘上.但是哪里?
有谁知道是否可以在.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,Field2和Field3.
然而,这不是一个真正可行的选择.这意味着,在编译时 …
.net compiler-construction clr language-features programming-languages
当我sizeof(int)在C#.NET项目中执行时,返回值为4.我将项目类型设置为x64,那为什么它会说4而不是8?这是因为我正在运行托管代码吗?
当我读到有关C#或Java等JITted语言的性能时,作者通常会说它们理论上应该/可以胜过许多本机编译的应用程序.理论上,本机应用程序通常只是为处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能并非真正在所有处理器上进行优化.另一方面,CLR可以在JIT过程中进行特定于处理器的优化.
有谁知道微软(或Mono)的CLR在JIT过程中是否实际执行特定于处理器的优化?如果是这样,有什么样的优化?
我有以下代码:
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.
如果我使用var或dynamic代替object,它的工作原理.
有什么想法吗?
假设有以下代码:
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语句的情况?(这些只是猜测)