Tag: clr

差异CLR和CLI以及如何从纯C调用它们

有人可以告诉我CLR和CLI之间的区别在于它的基本function,但最重要的是哪一个更好? 到目前为止,我得到的是使用ICLRRuntimeHost接口不允许我返回除int之外的任何内容,唯一允许的参数是LPCWSTR (请参阅ExecuteInDefaultAppDomain ) 此时我想知道是否可以/将为其C程序中的struct分配内存,将指针作为LPCWSTR string给ExecuteInDefaultAppDomain ,并将此指针转换回另一侧的struct以处理该struct 。 我不知道如何使用这个签名器对每个函数的限制: int fncname(string param); 我看了一下这个教程,但我不明白如何从C程序中调用C ++ / CLI,以及如何返回复杂对象或比int更复杂的东西。 有人可以告诉我如何在C中使用CLI ? 我似乎无法找到一些代码行来展示它是如何工作的。

如何注册CLR用户定义函数以用于linq查询?

使用SQL Server 2008我想在比较之前对DB值运行正则表达式。 我正在研究CLR用户定义函数(我调查了EDM函数,但我得到的印象是UDF更适合正则表达式 – 如果我错了请纠正我)。 理想情况下,我想像这样做一个linq调用: var results= db.Items.Where(i => i.CustomFormatFunction() == xyz); 到目前为止,我有这个c#代码: public static partial class UserDefinedFunctions { [SqlFunction] public static SqlString CustomFormatFunction(string str) { return Regex.Replace(Regex.Replace(HttpUtility.HtmlDecode(str), @”\s+”, “-“), “[^a-zA-Z0-9/-]+”, “”).ToLower(); } } 为了使我能够在linq查询中使用它,还需要哪些步骤?

好奇心:将C#结构转换为对象仍然会复制它

这个问题更多的是出于好奇而不是真正的问题。 请考虑以下代码(C#4.0,如果重要): class Program { static Point myPoint = new Point(3, 5); static void Main(string[] args) { Console.WriteLine(“Point Struct Before: ” + myPoint); object point = GetPoint(); Console.WriteLine(“Point Object Before: ” + point); myPoint.X = 10; Console.WriteLine(“Point Struct After: ” + myPoint); Console.WriteLine(“Point Object After: ” + point); } static object GetPoint() { return myPoint; […]

在.NET 4.0过程中创建.NET 2.0 AppDomain

我需要在.NET 4.0进程中动态创建.NET 2.0兼容程序集。 目前它是通过以下方式实现的: AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(…) ModuleBuilder mb = assemblyBuilder.DefineDynamicModule(…); 但不幸的是,所有生成的dll都是.NET 4.0(inheritance自我的4.0进程),这与我的其他.NET 2.0进程无关。 知道2个不同的CLR版本的AppDomain如何在同一个进程中共存?

虚拟和物理内存/ OutOfMemoryException

我正在开发一个64位的.Net Windows服务应用程序,它实际上会加载一堆数据进行处理。 在执行数据量测试时,我们能够压倒该进程并抛出OutOfMemoryException(当它失败时我没有关于进程的任何性能统计信息。)我很难相信该进程请求了一大块内存自从在64位计算机上运行以来,已超出该进程的允许地址空间。 我知道该进程正在一台机器上运行,该机器一直在80%-90%的物理内存使用率附近。 我的问题是:如果机器的可用物理内存严重不足,CLR是否会抛出OutOfMemoryException,即使进程不会超过其允许的虚拟内存量? 谢谢你的帮助!

使用.net 4.0测试程序集测试.net 3.5程序集时的风险有多大

我意识到Visual Studio 2010 sp1允许测试项目现在以3.5为目标。 但是,出于各种原因,我并不完全了解,我们的测试项目仍然以dot net 4.0为目标。 一般问题在标题中。 风险有多大? 具体来说,这可能意味着测试将在CLR v4中运行,而我们的许多客户将使用CLR v2。 此外,测试似乎使用v4库组件(例如System.Data),即使应用程序是针对v2构建的。 一个方法(System.Data.SqlClient.SqlBulkCopy)包含v2中的错误,该错误已在v4中修复。 我们的测试错过了。 暂且不说CLR,我怎样才能强制我的应用程序使用某些库的v2,即使它被v4测试程序集引用(加载到应用程序域中)? 我一直在尝试一个例子,似乎无法实现它。 我的3.5应用程序引用System.Data v2,并将程序集版本号回显到控制台。 从3.5测试程序集调用时,版本为2.0。 从4.0测试程序集中,版本为4.0。 (在我的应用程序的参考中,“特定版本”设置为true)

CLR如何处理静态类?

任何人都可以解释CLR如何处理静态类? CLR是否为内部处理静态类创建了一个单例实例? 如果没有,为什么我们在C#中有一个静态构造函数? (根据我的理解,我们仅使用构造函数来实例化类)

.NET中的对象布局结构使用反汇编程序

我有兴趣看到对象布局结构,并试图在visual studio中使用反汇编。 以下是我的代码: class myclass { public int m_a; } myclass myc = new myclass(); myc.m_a = 23; //I am setting a breakpoint after this line 我打开了Memory1窗口,在地址字段中输入myc。 我在输出窗口中获得了以下详细信息(使用Windows XP PC 32位和英特尔编译器): 0x0148B7BC 1c 93 a7 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 似乎在对象数据前面添加了一个额外的指针00a7931c,它将对象大小增加了4个字节。 我的困惑是文档说由于每个对象的标题,对象大小增加了8个字节。 有人可以指点我其他4个字节的位置吗?

CLR 2.0 vs 4.0性能?

如果运行unden CLR 4.0,为CLR 2.0编译的.NET程序运行速度会更快吗? 的app.config:

.Net框架中的手动内存分页(可能/如何?)

我对编写数据库管理系统很感兴趣。 阅读了几页关于如何实现SQL Server 2000的内容,我发现使用了4KB的内存页,每个页都是硬盘上4KB页面的直接副本。 这些页面根据需要加载到RAM中,然后在它们闲置时懒得写回磁盘(过度简化)。 在我的项目的规划阶段,我想知道在CLR上运行的代码中是否可以实现这种级别的控制。 我意识到C,C ++或D可能更适合这项任务,但我想首先向我自己certificate。 这背后的部分动机是我最终想用自己的数据库作为堆来覆盖CLR垃圾收集器,至少对于相对陈旧的对象。 是否可以直接从CLR控制内存? 如果是这样,我该怎么做? 现在假设我的数据是一堆256字节宽的结构/类,存储在磁盘上的平面表中,而我使用的是64KB页面。