Tag: clr4.0

在仅适用于.NET-4的系统上的GAC中使用面向.NET-2.0的COM DLL

再次问候, 按照我之前的问题,我正在尝试最大化我的C#编写的Windows资源管理器扩展的兼容性。 特别是,我有兴趣确保它在安装了.NET 4并且未安装.NET 3.5及更低版本的环境中工作。 人们会认为没有问题,但显然不是那么简单…… 有两个问题。 首先,非.NET-4目标程序集不会加载CLR 4,除非它们具有指定的.config文件。 如果没有这个.config文件,即使尝试在它们上使用ngen也会失败。 但我的DLL进入了GAC。 我如何在那里获得.config文件? 其他人也问过同样的事情,并得出结论“好吧,我只会改为创建一个静态的设置类。” 显然我做不到…… 第二个问题:当我用regasm.exe注册我的DLL,然后打开注册表查看它写的内容时,我在其CLSID条目下看到RuntimeVersion = v2.0.50727 。 这也可以防止加载DLL。 只有在我手动将RuntimeVersion值更改为RuntimeVersion后,DLL v4.0.30319加载。 那么我必须让我的安装程序在这里做什么? 对于第一个我不知道。 对于第二个,我想我必须让安装程序手动设置注册表的RuntimeVersion到任何.NET版本安装? 这看起来太古怪了……

CLR2编译的C#COM不适用于.Net 4

有谁知道为什么在CLR2(.Net 3.5)下编译的C#创建的COM库在仅与CLR4(.Net 4)一起使用时不起作用? CLR4中缺少什么在CLR2中用于COM? 我们在app.config中使用适当的启动来使C#在CLR4 / .Net 4下运行: 所有的C#东西都有效,直到它尝试创建我们的COM接口。 它提供了以下例外: 无法加载运行时。 (HRESULTexception:0x80131700) 当我们尝试从C ++创建COM接口时,我们遇到了同样的问题。 一旦我们安装CLR2(.Net 3.5),所有COM内容开始工作。 我们想知道发生了什么。

HyperDescriptor在.NET 4中构建时是否有效?

我正在开发一个.NET 4项目,并且能够从HyperDescriptor提供的动态属性访问中受益 ,但是当在.NET 4中构建时,它似乎无法正常工作。我从CodeProject下载了源代码,将解决方案的项目转换为VS2010,并将目标框架更新为4.0。 在构建并且示例正确执行时,时序显示使用HyperDescriptor进行动态属性访问是获取/设置对象值的最慢方式。 只有在使用.NET 4从源代码构建HyperDescriptor时,才会出现此问题。如果从.NET 4项目中添加对使用.NET 2构建的HyperDescriptor的引用,则可以正常工作。 这是目前可接受的解决方案,但是使用.NET 4构建会有一些潜在的优势吗? 任何人都想在HyperDescriptor上破解,看看为什么.NET 4版本的速度如此之慢?

typeof(T)可能返回null

在通过TypeBuilder创建的类型上使用typeof运算符时,运算符将返回null。 我很好奇为什么会这样,以及如何防止它。 我开始认为这是即时窗口中的VS错误,但我不太确定。 首先责怪别人很容易。 好的…重现问题的代码: static void Main() { AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName(“MyAssembly”), AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(“MyModule”); TypeBuilder typeBuilder = moduleBuilder.DefineType(“MyType”, TypeAttributes.Public, typeof(ArrayList)); ArrayList o = (ArrayList)Activator.CreateInstance(typeBuilder.CreateType()); Console.WriteLine(o.GetType().Name); } 如果在变量o之后放置断点并在VS立即Windows中键入typeof(MyType) ,则会出现问题。

.NET 4.0和C#4.0中的事件和委托逆转

在调查这个问题时,我对C#4.0中新的协方差/逆变特性将如何影响它感到好奇。 在Beta 1中,C#似乎不同意CLR。 回到C#3.0,如果你有: public event EventHandler Click; ……然后你在其他地方: button.Click += new EventHandler(button_Click); …编译器会barf因为它们是不兼容的委托类型。 但是在C#4.0中,它编译得很好,因为在CLR 4.0中,类型参数现在标记为in ,因此它是逆变的,因此编译器假定多播委托+=将起作用。 这是我的测试: public class ClickEventArgs : EventArgs { } public class Button { public event EventHandler Click; public void MouseDown() { Click(this, new ClickEventArgs()); } } class Program { static void Main(string[] args) { Button button = new Button(); […]