标签: clr

在64位计算机上基于AnyCPU vs x64平台构建的C#应用​​程序的性能

我必须在64位计算机上部署C#应用程序,尽管它也可能部署在32位计算机上.我应该构建两个针对x86和x64平台的独立可执行文件,还是应该针对"AnyCPU"平台(在项目属性的"构建"选项中指定)构建单个可执行文件.在C#程序集构建的目标"AnyCPU"之间是否存在任何性能差异?部署在64位计算机上与相同的程序集部署专门针对'x64'平台?

.net c# clr

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

为什么不可变对象是线程安全的?

class Unit {
    private readonly string name;
    private readonly double scale;

    public Unit(string name, double scale) {
        this.name = name;
        this.scale = scale,
    }

    public string Name { get { return name; } }
    public string Scale { get { return scale; } }

    private static Unit gram = new Unit("Gram", 1.0);

    public Unit Gram { get { return gram; } }
}
Run Code Online (Sandbox Code Playgroud)

多个线程可以访问Unit.Gram.为什么多个线程同时读取都可以Unit.Gram.Title

我担心的是他们指的是相同的内存位置.一个线程开始读取该内存,那么它是不是"被锁定"了呢?.NET是否处理下面这个关键部分的同步?或者我认为同步阅读需要同步?

.net c# clr immutability thread-safety

33
推荐指数
3
解决办法
4392
查看次数

.Net 4.0 Windows应用程序在Windows Server 2008下的clr.dll中崩溃

我有一个Windows应用程序计划每天运行,并由于以下日志在EventViewer中间歇性失败.

Faulting application name: MyApplication.exe, version: 1.0.0.0, time stamp: 0x4d54829a
Faulting module name: clr.dll, version: 4.0.30319.1, time stamp: 0x4ba21eeb
Exception code: 0xc0000005
Fault offset: 0x00000000000029e1
Faulting process id: 0xbb1c
Faulting application start time: 0x01cbd99223d8b4eb
Faulting application path: E:\MyApplication\MyApplication.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: 7e74ec7e-45a5-11e0-a95d-003048de380d
Run Code Online (Sandbox Code Playgroud)

在第二个EventViewer日志中,它说:

The process was terminated due to an internal error in the .NET Runtime at IP 000007FEF97329E1 (000007FEF9730000) with exit code 80131506.
Run Code Online (Sandbox Code Playgroud)

服务器是Win Server 2008 R2,应用程序使用.Net 4.0(您也可以在错误日志中看到).

应用程序密集使用多线程并从远程数据库读取并写入本地硬盘.

有关此问题的原因和任何帮助如何调查?我不知道它在应用程序的生命周期中失败了大约5-10个小时.

windows crash clr .net-4.0

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

CLR实现对接口成员的虚方法调用

出于好奇:CLR如何调度虚拟方法调用接口成员到正确的实现?

我知道CLR为每种类型维护的VTable,每个方法都有方法槽,并且每个接口都有一个额外的方法槽列表,指向相关的接口方法实现.但我不明白以下内容:CLR如何有效地确定从类型的VTable中选择哪个接口方法槽列表?

从2005年5月刊的MSDN杂志中了解CLR如何创建运行时对象的文章Dril Into .NET Framework Internals讨论了由接口ID索引的进程级映射表IVMap.这是否意味着同一进程中的所有类型都具有指向同一IVMap的相同指针?

它还指出:

如果MyInterface1由两个类实现,则IVMap表中将有两个条目.该条目将指回嵌入在MyClass方法表中的子表的开头.

CLR如何知道要选择哪个条目?它是否进行线性搜索以查找与当前类型匹配的条目?还是二元搜索?或者某种直接索引并且有一个可能有很多空条目的地图?

我还通过C#第3版阅读了CLR中的接口章节,但它没有谈到这一点.因此,这个问题的答案没有回答我的问题.

c# clr interface dispatch method-call

32
推荐指数
2
解决办法
5030
查看次数

ConditionalWeakTable <TKey,TValue>应该用于非编译目的吗?

我最近ConditionalWeakTable<TKey,TValue>在我的搜索中遇到了一个IDictionary使用弱引用的类,正如这里这里的答案中所建议的那样.

一篇明确的MSDN文章介绍了该类,并指出:

您可以在System.Runtime.CompilerServices命名空间中找到类.... 它在CompilerServices中,因为它不是通用字典类型:我们打算只让编译器编写者使用它.

然后再说:

...有条件的弱表不是一个通用的集合...但是如果你正在编写自己的.NET语言并且需要公开将属性附加到对象的能力,你一定要查看条件弱表.

与此一致,该类的MSDN条目描述如下:

使编译器能够将对象字段动态附加到托管对象.

显然它最初是为了一个非常特定的目的而创建的 - 帮助DLR,System.Runtime.CompilerServices命名空间体现了这一点.但它似乎发现了更广泛的用途 - 即使在CLR中也是如此.例如,如果我在ILSpy中搜索ConditionalWeakTable的引用,我可以看到它在MEF类和内部WPF 类中使用.CatalogExportProviderDataGridHelper

我的问题是在编译器编写和语言工具之外是否可以使用ConditionalWeakTable,以及在未来的.NET版本中是否会产生额外开销或实现变化的风险.(或者应该避免使用像这样的自定义实现).

另外也进一步阅读这里,这里这里有关如何ConditionalWeakTable利用一个隐藏的CLR实现的ephemerons(通过System.Runtime.Compiler.Services. DependentHandle)来处理键和值之间的周期问题,以及如何能够不容易在一个自定义的方式来完成.

c# clr garbage-collection weak-references ephemeron

32
推荐指数
1
解决办法
4736
查看次数

什么是CLR托管?

什么是CLR托管?那是什么用例?

.net clr clr-hosting

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

如何为Int32实现GetHashCode()?

我一直在寻找这个地方,但我找不到任何东西.任何人都可以对此有所了解吗?

.net c# clr

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

JIT vs NGen - 有什么区别?

因此,当CLR运行时加载.NET程序集时,它会将其编译为机器本机代码.此过程称为JITing.NGen也是将.NET程序集编译为本机代码的过程.我不明白两者有什么区别?

.net clr jit ngen

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

在同一进程中将.NET 3.5与4/4.5程序集混合使用

我想将基于.NET 3.5 WinForms的应用程序迁移到最新的.NET版本(4.5).

该应用程序使用"外部"组件(可以被认为是插件),这些组件目前也是基于.NET 3.5的.

我想知道在我们使用.NET 4.5 转换应用程序进行编译的情况下使用了什么运行时/核心库?

这种情况应该适当吗?(在4.5进程中加载​​.NET 3.5程序集)?*插件程序集通过反射加载.

CLR运行时如何处理这种情况?这是一种安全的做法吗?

.net c# clr

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

无法加载SqlServerSpatial.dll

我试图在C#.Net项目中使用SqlServer Spatial CLR类型.我想使用SqlGeometry来查询我的数据库中的空间记录.

我在本地计算机上运行Visual Studio 2010中运行的单元测试,命中远程SqlServer计算机.都好.

然后,我将WCF Rest服务发布到我的本地IIS实例,该实例具有与单元测试匹配相同类库的服务,以进行一些空间查询,并且失败.

我收到一个错误说

无法加载DLL SqlServerSpatial.dll:找不到指定的模块.

我用谷歌搜索了这个并找到了许多答案 - 对我来说都没有用.我有:

  • 在GAC中注册了CLR类型
  • 安装64位,后来也安装了32位版本的VC++
  • 尝试了使用不同的Microsoft.SqlServer.Types dll版本的许多变体

我唯一没做过的,坦率地拒绝做的是在实际的SqlServer盒子上安装任何东西.这对我来说似乎没用.

在这一点上,我唯一能想到的是导致这是一个权限问题,因为它在IIS应用程序池中运行,而不是在单元测试中工作的Studio内部.

请注意,在我的项目中,我从不参考错误消息中提到的DLL.那个dll出现在sql box上,但我无法将它添加到工作室,因为它在我尝试时会给出一些消息.我在这里尝试的东西已经用完了.这是90年代dll地狱了.

.net c# sql-server clr geospatial

31
推荐指数
3
解决办法
4万
查看次数