日期:2014-05-17  浏览次数:21028 次

[提问]net2.0的dll被4.0的程序或站点引用,底层是使用4.0的core还是2.0的core呢?
先分享一个net4.0的优化点,在4.0出来以前,我一直都不推荐使用String.Format方法,因为这个方法反编译得到的代码如下:
StringBuilder stringBuilder = new StringBuilder(format.Length + args.Length * 8);
    stringBuilder.AppendFormat(provider, format, args);
    return stringBuilder.ToString();


后来4.0出来后,这个方法已经优化了,反编译得到的代码如下,对StringBuilder进行了缓存:
StringBuilder stringBuilder = StringBuilderCache.Acquire(format.Length + args.Length * 8);
stringBuilder.AppendFormat(provider, format, args);
return StringBuilderCache.GetStringAndRelease(stringBuilder);


由此得到一个疑问,如果我编译了一个net2.0的dll,这个dll被4.0的项目引用了,在运行时,到底是采用2.0的String.Format还是4.0的??

另外,这个东东除了分析dump,有其它方法可以验证吗?

btw:net4.0的StringBuilder也进行了大幅度优化,不再有大对象的产生了,可以参考:http://www.th7.cn/Program/net/2012/01/06/54152.shtml

所以,建议后续的项目都升级到4.0吧,我也可以放心的使用String.Format了

------解决方案--------------------
引用:
重复一下我的疑问:
如果我编译了一个net2.0的dll,这个dll被4.0的项目引用了,在运行时,到底是采用2.0的String.Format还是4.0的??

我相信是编译期绑定,就始终调用2.0的API。
否则莫名其妙的运行期BUG会太多了。
------解决方案--------------------
我也觉得是2楼的意思
------解决方案--------------------
肯定是调用4.0的了。
因为String.Format是调用的.net类库里的函数,
假设你的机器只装了4.0没装2.0, 那不是要挂?
------解决方案--------------------
调用2.0的,支持2楼,你只装了4.0没装2.0,在编译或者运行的时候会报错,这个问题我遇到过,假如说你用.net3.5编译的dll,你在装了.net4.0没有装.net3.5是不可以使用的
------解决方案--------------------
这里有中文的
http://msdn.microsoft.com/zh-cn/library/db7849ey(v=vs.90).aspx

再看不懂,一句话,加载的是4.0的。
------解决方案--------------------
应该是4.0的吧 你可以试试报这样的程序部署到只安装4.0的机器上运行一下,如果能运行说明就是4.0吧