我有一个大的c#解决方案文件(~100个项目),我正在努力改善构建时间.我认为"复制本地"在很多情况下对我们来说都是浪费,但我想知道最佳做法.
在我们的.sln中,我们有应用程序A取决于程序集B,它取决于程序集C.在我们的例子中,有几十个"B"和一些"C".由于这些都包含在.sln中,我们正在使用项目引用.所有程序集当前都构建为$(SolutionDir)/ Debug(或Release).
默认情况下,Visual Studio将这些项目引用标记为"复制本地",这会导致每个"C"被复制到$(SolutionDir)/ Debug中,对于构建的每个"B".这似乎很浪费.如果我只关闭"复制本地",会出现什么问题?大型系统的其他人做什么?
跟进:
很多响应建议将构建分解为较小的.sln文件......在上面的示例中,我将首先构建基础类"C",然后是大量模块"B",然后是一些应用程序,"一个".在这个模型中,我需要对来自B的C进行非项目引用.我遇到的问题是"Debug"或"Release"被添加到提示路径中,我最终构建了我的Release版本的"B"反对"C"的调试版本.
对于那些将构建拆分为多个.sln文件的人,如何管理这个问题?
假设一个大型复合应用程序构建在自己的程序集中打包的几个基础组件上:(数据库读取,协议处理程序等).对于某些部署,这可以包括20多个程序集.每个程序集都有设置或配置信息.我们的团队倾向于喜欢VS设置编辑器(以及它生成的易用代码!),应用程序与用户的区别满足了我们的大多数需求.
但....
将许多配置部分复制并粘贴到我们的应用程序的.xml中非常繁琐.此外,对于跨应用程序往往具有类似配置的共享组件,这意味着我们需要在多个.config文件中维护重复设置.
微软的EntLib使用外部工具解决了这个问题,以生成怪物.config文件,但这也感觉很笨拙.
您使用什么技术来管理包含来自多个共享程序集的大型.NET .config文件?某种包含机制?自定义配置读者?
跟进:
Will的回答正是我所得到的,并且对于平键/值对部分看起来很优雅.有没有办法将此方法与自定义配置部分相结合?
还要感谢有关为不同构建目标管理不同.configs的建议.这也很有用.
戴夫
我正在寻找IA32上极其快速的atof()实现,针对US-en语言环境,ASCII和非科学表示法进行了优化.Windows多线程CRT在这里惨败,因为它检查每次调用isdigit()时的语言环境变化.我们目前最好的是源自perl + tcl的最佳实现,并且优于msvcrt.dll的atof一个数量级.我想做得更好,但我没有想法.与BCD相关的x86指令似乎很有希望,但我无法让它超越perl/tcl C代码.任何SO'ers都可以找到最好的链接吗?也欢迎基于非x86组件的解决方案.
根据初步答案澄清:
对于该应用,~2 ulp的不准确性是好的.
要转换的数字将通过网络小批量地到达ascii消息,我们的应用程序需要以尽可能低的延迟转换它们.
是否有任何堆数据结构实现,斐波那契,二进制或二项式?
参考:这些是用于实现优先级队列的数据结构,而不是用于分配动态内存的数据结构.见http://en.wikipedia.org/wiki/Heap_(data_structure)
谢谢,戴夫
我们需要优化C#Windows窗体应用程序的文本呈现,在不规则网格中显示大量小字符串.任何时候都可以看到超过5000个单元格,每秒更新4次.字体系列和大小在单元格中是一致的,尽管颜色可能因单元格而异,粗体/斜体/单元格也不同.
我已经在网上看到有关TextRenderer.DrawText与Graphics.DrawString最快/最好的信息相冲突的信息,这在Win32级别上降低为GDI与GDI +的比较.
我在Windows XP和Windows Vista上也看到了截然不同的结果,但我的主要目标是Windows XP.在WinFX和DirectX 10下取得巨大进步的文章在这里没有用:-)
这里最好的方法是什么?我不害怕引入一个小的C++/CLI层并优化设备上下文处理以挤出更多性能,但我想要一些关于采取哪个方向的明确建议.
编辑:感谢您的初步回复.我将尝试组合背景位图渲染并坚持使用GDI等效调用.
我有一个项目,其中包括一些性能敏感的本机C++标头,大量使用模板.对于这个项目,我们还包装头文件并添加一些粘合代码以向c#和其他.NET语言公开功能.我们将此标题称为"layout.h",我们将假设它是第三方标题,我无法更改.
在混合模式C++/CLI程序集中,从#pragma unmanaged(或#pramga managed(push,off))代码中的某个位置出错并#include相对容易.当发生这种情况时,模板会生成IL,并且在运行代码时会获得额外的托管/非托管转换,并且性能会下降.
我的问题是,是否有一种方法可以在#include之前进行编译时检查,以便编译失败,如果我意外地从错误的上下文#including.
// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
ASSERT_UNMANAGED()
#include <layout.h>
Run Code Online (Sandbox Code Playgroud)
我天真的第一次尝试检查了#ifdef _MANAGED,但总是定义我是否在#pragma非托管代码块中.
我正在开发一个项目来增强我们的生产调试功能.我们的目标是在任何未处理的异常上可靠地生成minidump,无论异常是托管还是非托管,以及它是在托管或非托管线程上发生的.
我们目前使用优秀的ClrDump库,但它并没有完全提供我们需要的确切功能,我想了解异常过滤背后的机制,所以我开始尝试自己.
我开始关注这篇博客文章,自己安装一个SEH处理程序:http: //blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx.这种技术适用于控制台应用程序,但是当我从WinForms应用程序尝试相同的事情时,我的过滤器不会被调用任何种类的非托管异常.
ClrDump可以做什么,我不做什么?ClrDump在所有情况下都会生成转储,因此必须仍然调用其异常过滤器...
注意:我知道ADPlus的功能,我们也考虑过使用AeDebug注册表键......这些也是可能性,但也需要权衡.
谢谢,戴夫
// Code adapted from <http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx>
LONG WINAPI MyExceptionFilter(__in struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("Native exception filter: %X\n",ExceptionInfo->ExceptionRecord->ExceptionCode);
Beep(1000,1000);
Sleep(500);
Beep(1000,1000);
if(oldFilter_ == NULL)
{
return EXCEPTION_CONTINUE_SEARCH;
}
LONG ret = oldFilter_(ExceptionInfo);
printf("Other handler returned %d\n",ret);
return ret;
}
#pragma managed
namespace SEHInstaller
{
public ref class SEHInstall
{
public:
static void InstallHandler()
{
oldFilter_ = SetUnhandledExceptionFilter(MyExceptionFilter);
printf("Installed handler old=%x\n",oldFilter_);
}
};
}
Run Code Online (Sandbox Code Playgroud) 我们看到.NET 4.5和System.DateTime的奇怪行为.应用于具有Kind = Utc的DateTime对象时,ToLocalTime()的行为在使用.NET 4.5的Server 2008R2计算机上与.NET 4.0相比时显得不同.更奇怪的是,安装了.NET 4.5的开发者PC上并没有出现这个问题.
有没有人对这种行为有解释?我无法在Microsoft网站上发现任何错误报告.我们可以使用更复杂的方法来转换有效的时间,但是很难确保将来没有人使用.ToLocalTime().
开发人员PC - 在VS2012安装期间安装的Windows 7,VS2012,.NET 4.5:
unixEpoch 621355968000000000 Utc
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified
Run Code Online (Sandbox Code Playgroud)
Production Server 1 - Server 2008R2,.NET 4.0
unixEpoch 621355968000000000 Utc
asLocal1 635121441023588986 Local
asLocal2 635121441023588986 Unspecified
Run Code Online (Sandbox Code Playgroud)
Production Server 2 - 作为独立软件包安装的Server 2008R2,.NET 4.5
unixEpoch 621355968000000000 Utc
asLocal1 ***635121405023588986*** Local
asLocal2 635121441023588986 Unspecified
Run Code Online (Sandbox Code Playgroud)
除了安装.NET 4.5之外,生产服务器1和2是相同的.当在全球几个不同的本地时区运行时,问题就会出现.
演示此问题的示例代码:
using System;
using NUnit.Framework;
namespace DateTimeToLocal
{
[TestFixture]
public class DateTimeFixture
{
private const long unixTimeInNanos = 1376561702358898611;
[Test]
public void Demonstrate() …Run Code Online (Sandbox Code Playgroud) 在我的机器上的VS2008,SP1下调试时,我遇到了令人讨厌的锁定.我正在运行ProcMon.exe来尝试确定发生了什么.我看到的一件事是100s或1000s的重复读取+写入一个名为security.config.cch和security.config.cch.new的文件.
这些文件是什么?为什么我的应用程序需要重复读取+写入此文件?
谢谢,戴夫
示例:
2:18:14.1421944 PM App.vshost.exe 1152 ReadFile C:\Documents and Settings\myuser\Application Data\Microsoft\CLR Security Config\v2.0.50727.42\security.config.cch SUCCESS Offset: 170,397, Length: 208 2:18:14.1422854 PM App.vshost.exe 1152 ReadFile C:\Documents and Settings\myuser\Application Data\Microsoft\CLR Security Config\v2.0.50727.42\security.config.cch SUCCESS Offset: 170,605, Length: 224 2:18:14.1423824 PM App.vshost.exe 1152 WriteFile C:\Documents and Settings\myuser\Application Data\Microsoft\CLR Security Config\v2.0.50727.42\security.config.cch.new SUCCESS Offset: 206,817, Length: 208 2:18:14.1424843 PM App.vshost.exe 1152 WriteFile C:\Documents and Settings\myuser\Application Data\Microsoft\CLR Security Config\v2.0.50727.42\security.config.cch.new SUCCESS Offset: 207,025, Length: 224 2:18:14.1425788 PM App.vshost.exe 1152 WriteFile C:\Documents and Settings\myuser\Application Data\Microsoft\CLR Security Config\v2.0.50727.42\security.config.cch.new SUCCESS …