Tag: clr

我的.Net应用程序可以引用两个不同版本的.net框架库吗?

假设我有两个项目,P4和P3,分别针对.net 4.0和3.5。 每个项目还有一个System.Data的引用。 在P4的情况下,它将是System.Data v4.0.0.0在P3的情况下,它将是System.Data v2.0.0.0 P4项目也参考了P3。 如果加载并执行P4,则使用.net 4.0 CLR。 在运行时,对System.Data的引用似乎在P4和P3内解析为v4.0。 我可以通过使用assemblyBinding重定向覆盖它,但P4和P3都解析为v2.0。 有什么方法可以配置我的应用程序,以便P4使用v4.0和P3使用v2.0?

由于缓存委托,c#编译器的奇怪行为

假设我有以下程序: static void SomeMethod(Func otherMethod) { otherMethod(1); } static int OtherMethod(int x) { return x; } static void Main(string[] args) { SomeMethod(OtherMethod); SomeMethod(x => OtherMethod(x)); SomeMethod(x => OtherMethod(x)); } 我无法理解编译的il代码(它使用太多额外的代码)。 这是简化版: class C { public static C c; public static Func foo; public static Func foo1; static C() { c = new C(); } C(){} […]

如何在CLR UDF中返回nvarchar(max)?

假设以下定义: /// /// Replaces each occurrence of sPattern in sInput with sReplace. This is done /// with the CLR: /// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace). /// The result of the replacement is the return value. /// [SqlFunction(IsDeterministic = true)] public static SqlString FRegexReplace(string sInput, string sPattern, string sReplace) { return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace); } sInput长度> […]

所有C#强制转换都会导致装箱/取消装箱

我很想知道C#中的所有演员阵容是否会导致拳击,如果不是,所有演员阵容都是昂贵的操作? 从装箱和拆箱中取出的示例(C#编程指南) int i = 123; // The following line boxes i. object o = i; 这一行显然导致装箱(将int类型包装为一个对象)。 这是一项被认为代价高昂的操作,因为它会产生将要收集的垃圾。 那些来自2种不同类型的参考类型的演员表怎么样? 那是多少钱? 可以正确测量吗? (与前一个例子相比) 例如: public class A { } public class B : A { } var obj = new B(); var obj2 = (A)obj; // is this an “expensive” operation? this is not boxing

什么时候System.Double不是双倍的?

看到在C#中double.Nan == double.NaN总是假的之后,我开始好奇如何在引擎盖下实现平等。 所以我使用Resharper来反编译Double结构,这是我发现的: public struct Double : IComparable, IFormattable, IConvertible, IComparable, IEquatable { // stuff removed… public const double NaN = double.NaN; // more stuff removed… } 这似乎表明结构Double声明了一个用这个特殊的小写double定义的常量,尽管我一直认为这两个是完全同义的。 更重要的是,如果我使用小写双精度执行实现,Resharper只需将我滚动到文件顶部的声明。 同样,跳转到小写的NaN只需要我在行中的常量声明! 所以我试图理解这个看似递归的定义。 这只是反编译器的人工制品吗? 可能是Resharper的限制? 或者这个小写的双重实际上是一个完全不同的野兽 – 代表CLR / CTS中较低级别的东西? NaN真的来自哪里?

ASP.NET解决方案的本机程序集绑定失败

注意:这个问题的主要目的是理解/解释 CLR的程序集绑定行为。 一旦确定原因,解决方案应该是明显的。 请知道我知道我的设置不是最佳的(nativedll没有签名和版本化等)但我再次想要调查CLR的绑定行为。 我试图在我的asp.net解决方案中使用本机(非COM,C ++)DLL。 我将避免命名dll,因为我认为它会将问题转移到错误的方向。 本机dll来自博客站点,并没有太多的信息。 我没有关于本地dll的任何信息,比如它编译的架构,它是什么文化和版本等。使用提供的包装器,我可以在控制台应用程序中正确使用dll。 它工作,即使我们必须使用部分程序集名称进行绑定。 本机程序集的包装器具有DLL导入,如[DllImport(“nativedll.dll”)] public static extern void someMethod([Out] BE_VERSION pbeVersion); 我已阅读有关CLR程序集绑定的大量信息,包括: 运行时如何定位程序集 assembly的最佳实践 根据我的理解,我们应该能够加载程序集,但没有。 我得到程序集绑定错误。 建立 调用本机dll的我的帮助程序库(编译为MSIL(任何CPU))是强名称的并且在GAC中。 。 我在IIS上的Win 7,x64位机器上运行我的asp.net应用程序,而不是可视工作室开发服务器。 nativedll没有签名而且没有GAC。 问题 总结是,当我将原生dll放在windows目录中时,(c:\ Windows)解决方案工作正常。 在任何其他情况下,我得到程序集绑定错误。 质询 1.我想知道为什么程序集在Windows目录中被删除时会被绑定? 2.错误是什么意思:错误:从文件中提取清单导入时出错(hr = 0x80131018)? (查看场景1,场景6) 3.为什么对Assembly.Load *()方法的调用失败? (情景3,4,5) 我的测试结果 场景1: **Setup** Calling Assembly: GACed. Native Assembly: Included in project; Build Action: […]

RuntimeHelpers.GetHashCode做了什么

RuntimeHelpers.GetHashCode(object)方法允许基于对象的标识生成哈希码。 MSDN 声明 : RuntimeHelpers.GetHashCode方法总是非虚拟地调用Object.GetHashCode方法,即使对象的类型已重写Object.GetHashCode方法。 [MethodImpl(MethodImplOptions.InternalCall)] [SecuritySafeCritical] public static extern int GetHashCode(object o); 但是,在使用Reflector(.NET 4.0)检查Object.GetHashCode()方法时,我们将看到以下代码: public virtual int GetHashCode() { return RuntimeHelpers.GetHashCode(this); } 这让我相信MSDN文档是错误的,因为从RuntimeHelpers.GetHashCode(object)调用Object.GetHashCode会导致堆栈溢出。 那么RuntimeHelpers.GetHashCode(object)的实际行为是什么?它是如何工作的? 它是如何计算哈希值的?

捕获OutOfMemoryException如何工作?

我对使用try / catch块捕获OutOfMemoryException这一事实感到有些困惑。 给出以下代码: Console.WriteLine(“Starting”); for (int i = 0; i < 10; i++) { try { OutOfMemory(); } catch (Exception exception) { Console.WriteLine(exception.ToString()); } } try { StackOverflow(); } catch (Exception exception) { Console.WriteLine(exception.ToString()); } Console.WriteLine("Done"); 我用来创建OutOfMemory + StackOverflowException的方法: public static void OutOfMemory() { List data = new List(1500); while (true) { byte[] buffer […]

使用Lua和C#最有效的方法是什么?

根据我的理解,Lua是一种可嵌入的脚本语言,可以在对象上执行方法。 要避免哪些陷阱? 使用Lua作为解释器并在Web环境中执行方法或作为规则引擎是否可行?

SQL CLR:流表重要的函数结果

我的问题与这个问题非常相似。 但是,我正在使用SQL Server 2005 Service Pack 2(SP2)(v9.0.3042),并且在那里发布的解决方案对我不起作用。 我尝试使用两个连接字符串。 一个在我的代码中被注释掉了。 我意识到我可以将所有结果存储在内存中的List或ArrayList中并返回它。 我已经成功完成了,但这不是目标。 目标是能够在结果可用时传输结果。 这可能使用我的SQL Server版本吗? 这是我的代码:(注意,目前实际上并没有使用这些参数。我这样做是为了调试) public static class StoredProcs { [SqlFunction( DataAccess = DataAccessKind.Read, SystemDataAccess=SystemDataAccessKind.Read, FillRowMethodName=”FillBaseline”, TableDefinition = “[baseline_id] [int], [baseline_name] [nvarchar](256), [description] [nvarchar](max), [locked] [bit]” )] public static IEnumerable fnGetBaselineByID(SqlString projectName, SqlInt32 baselineID) { string connStr = “context connection=true”; //string connStr = “data source=.;initial […]