我已经和它搏斗了几天,经过大量的搜索,我找不到我应该走的路.
我想要做的是建立一个MSBUILD项目,它将构建我们的整个.NET应用程序(8个解决方案的常量,可能有250个项目在它们之间拆分),并从单个项目文件中覆盖了许多设置以进行调试构建为了我自己.
具体来说,我想构建我们的发布配置,优化关闭并生成完整的调试信息/ pdbs.另外,为了减少我们当前超长的构建时间,我希望每个项目的每个引用都"复制本地"(或实际的proj文件xml中的私有)为false.
第一件事情相当简单,我可以相当轻松地覆盖项目级属性(你甚至可以使用/ p从MSBuild命令行执行此操作),但我无法弄清楚如何覆盖引用上的属性.我已经尝试过在StackOverflow和网络上看到的几件事,但还没有解决方案.
我可以通过改变Microsoft.Common.targets做我想做的事情,注释掉_CopyFilesMarkedCopyLocal目标中的代码完全跳过这些文件的复制.但我不想改变我的全局配置并在所有情况下都这样做.我创建了自己的备用目标文件 - 如果我将单个项目文件更改为指向它,则可以正常工作 - 但我无法弄清楚如何指定它在顶层使用(我的.proj文件只是构建所有8种解决方案).如果我能以某种方式覆盖顶层的_CopyFilesMarkedCopyLocal目标,那将是很好的,这样如果MS更改默认目标文件,我的构建不会搞砸,但我也无法弄清楚如何使这项工作.
最好的办法是,如果有一种方法可以覆盖引用级属性,就像你可以项目级属性一样,而不必重写/覆盖构建目标的东西 - 但是我没有发现任何可能的信息.
在此先感谢任何帮助.
PS我实际上不可能只浏览所有项目文件并进行更改; 我需要一个解决方案,将现有代码保留原样.
我的手上有一个严重的头疼.我正在研究我们的应用程序中的WPF组件的性能问题.
我们的.net应用程序非常庞大,几乎完全以windows形式存在.作为新计划的一部分,我们使用丰富的WPF ui重写了我们的核心组件之一.有很多WinForms < - > WPF互操作正在将这个东西粘合在一起,我怀疑这可能与我所看到的有些相关.
当我在ANTS探查器中分析慢速操作时,我发现在函数UnsafeNativeMethods.IntGetMessageW中发生了很多活动.ANTS报告了与我们所有业务逻辑和wpf渲染内容相结合的CPU活动.没有使用循环的该函数的托管代码下线,所以无论IntGetMessageW正在做什么,我都会追求.
我对win32编程并不是特别精通,但我知道在该上下文中消息循环的基础知识.我在这里看到的并不是我们手动完成的任何事情 - 在我们的代码中,我们不会直接与底层的messageloop本身或者可以在WPF调度程序上访问的任何更复杂的东西进行交互.
我们这里讨论的WPF组件是从Window继承而来的(即它不仅仅是一个控件/用户控件),我们使用ShowDialog从我们用于在此组件的旧WinForms版本上调用ShowDialog的更高级逻辑中显示它.我们在WPF组件中使用了一些WindowsFormsIntegrationHost控件,以保持与我们在WPF中无法重写的一些现有部分的兼容性.
我已经研究了好几天了,但是从来没有发现过很多东西.我一直在寻找关于输入消息(鼠标和键盘)的模糊相关帖子,但我不知道我能做些什么来验证它; 我已经尝试过屠宰代码来删除我能做的所有鼠标/键盘操作.
我很难到达任何地方,主要是因为这行代码是完全孤立的(不是我可以指出的实际来自我们的代码的任何内容的父或子),并且完全不透明它正在做什么.
这是ShowDialog函数的ANTS调用图的图像,显示了到达此处的调用路径:

我完全意识到这可能是必须要作为WPF的一部分完成的事情(尽管我们在WPF中编写的其他组件不显示此行为),或者这只是ANTS探查器中的一个非常奇怪的错误,但是在这一点我需要以某种方式验证它.如果有人能告诉我这里发生了什么或者可能会发生什么 - 或者指出某些方式我能够自己解决这个问题,我将以你的方式引导各种善意的业力.
更新:在回答下面的一些讨论时,这是ANTS的另一个视图 - 这个更好地说明了我遇到的困惑(这是在"CPU时间"模式下的ANTS视图).我匆忙审查了部分代码,但没有系统相关的功能:

谢谢你的期待!
因此,我正在研究人力资源部门所需的基于网络的补充系统,以存储和搜索前人员的记录.我满足了这个要求,但最终传下来的是系统必须能够通过完整的SSN进行搜索,并检索完整的SSN.除了我的抗议之外,采取一些措施保护这些数据实际上将是他们现在正在做的事情的巨大改进(你不想知道).
我一直在做很多研究,我认为我已经提出了一个合理的计划 - 但是就像所有加密/安全相关的东西都有很多复杂性,并且很容易犯错误.我的粗略计划如下:
除了需要以相对安全的方式存储密钥(上面的数字3)之外,它似乎足够坚固.
对我们不起作用的事情:
这只是我们网络的内部,所以我们至少在这里实现的任何内容上都有这层保护.对应用程序本身的访问将由活动目录控制.
感谢您阅读,以及任何建议.
更新#1:我从评论中意识到为SSN检索字段保留私有IV是没有意义的.我更新了计划,为每条记录正确生成新IV,并将其与加密值一起存储.
更新#2:我正在删除我不能做的事情列表中的硬件内容.我做了一些研究,看起来这些东西比我想象的更容易接近.使用其中一个USB安全令牌的东西是否为密钥存储增加了有意义的安全性?
我正在编写一个压缩库作为一个小的项目,我已经足够了(我的库可以提取任何标准的gzip文件,以及生成兼容的(但肯定不是最佳的)gzip输出)是时候计算了一个有意义的块终止策略.目前,我只是在每32k输入(LZ77窗口大小)之后关闭块,因为它是通用的并且快速实现 - 现在我回过头来尝试实际提高压缩效率.
该放气的规格只有这样说的:"压缩机终止块时,它确定开始用新鲜的树一个新的模块将是有益的,或者当块大小填补了压缩机的缓冲块",这是不是所有的这很有帮助.
我通过SharpZipLib代码进行了排序(因为我认为这将是一个可读的开源实现),并发现它每16k字节的输出终止一个块,忽略输入.这很容易实现,但似乎必须有一些更具针对性的方法,特别是考虑到规范中的语言"确定用新鲜树开始新块将是有用的".
那么,是否有人对新战略或现有战略的例子有任何想法?
提前致谢!
更新:嘿家伙感谢回复.昨晚和今晚我尝试了几种不同的方法,并提出了类似于Jeff下面列出的方法(我甚至已经完成了他在更新中建议的内容,并将我自己的简单LL实现放在一起以获得额外收益).这是代码,此时它看起来并不特别干净,但是我已经多次改变了我可以做的任何事情以增强性能.
public class NewLRU2<K, V> where V : class
{
int m_iMaxItems;
Dictionary<K, LRUNode<K, V>> m_oMainDict;
private LRUNode<K,V> m_oHead;
private LRUNode<K,V> m_oTail;
private LRUNode<K,V> m_oCurrent;
public NewLRU2(int iSize)
{
m_iMaxItems = iSize;
m_oMainDict = new Dictionary<K, LRUNode<K,V>>();
m_oHead = null;
m_oTail = null;
}
public V this[K key]
{
get
{
m_oCurrent = m_oMainDict[key];
if (m_oCurrent == m_oHead)
{
//do nothing
}
else if (m_oCurrent == m_oTail)
{
m_oTail = m_oCurrent.Next;
m_oTail.Prev = null;
m_oHead.Next = m_oCurrent;
m_oCurrent.Prev = m_oHead; …Run Code Online (Sandbox Code Playgroud) 所以我有一个讨厌的堆栈溢出,我一直试图追踪/解决过去8个小时左右,我正处于我认为我需要建议的地步.
细节:有趣的是,这个代码在我们的常规winforms应用程序的上下文中调用时运行良好 - 但我的任务是编写一个基于Web的软件版本,这个相同的代码会导致堆栈溢出在IIS上运行的ASPX页面.我做的第一件事就是通过visual studio附加并尝试正常的.NET调试.在异常点,调用堆栈看起来相对较浅(我们的代码深约11帧),并且我在堆栈溢出(错误的递归,自调构造器,异常循环)上找不到任何常见的嫌疑.
因此我决定打破windbg和SOS - 我知道这对于这类事情很有用,尽管我自己的经验有限.经过几个小时的讨论,我想我有一些有用的数据,但我需要一些帮助来分析它.
首先是一个!dumpstack我在堆栈溢出即将降临之前就已经破坏了.
0:015> !dumpstack
PDB symbol for mscorwks.dll not loaded
OS Thread Id: 0x1110 (15)
Current frame: ntdll!KiFastSystemCallRet
ChildEBP RetAddr Caller,Callee
01d265a8 7c827d0b ntdll!NtWaitForSingleObject+0xc
01d265ac 77e61d1e kernel32!WaitForSingleObjectEx+0x88, calling ntdll!NtWaitForSingleObject
01d2661c 79e789c6 mscorwks!LogHelp_NoGuiOnAssert+0x58ca
01d26660 79e7898f mscorwks!LogHelp_NoGuiOnAssert+0x5893, calling mscorwks!LogHelp_NoGuiOnAssert+0x589b
01d26680 79e734c4 mscorwks!LogHelp_NoGuiOnAssert+0x3c8, calling mscorwks+0x17c0
01d26694 79fc1d6b mscorwks!CorExeMain+0x8724, calling kernel32!InterlockedDecrement
01d26698 79ef3892 mscorwks!GetCLRFunction+0x107de, calling mscorwks+0x17c0
01d266b0 79e78944 mscorwks!LogHelp_NoGuiOnAssert+0x5848, calling mscorwks!LogHelp_NoGuiOnAssert+0x584c
01d266c4 7a14de5d mscorwks!CorLaunchApplication+0x2f243, calling mscorwks!LogHelp_NoGuiOnAssert+0x5831
01d266ec 77e61d1e kernel32!WaitForSingleObjectEx+0x88, calling ntdll!NtWaitForSingleObject
01d266f8 77e61d43 kernel32!WaitForSingleObjectEx+0xad, calling kernel32!GetTickCount+0x73
01d26714 …Run Code Online (Sandbox Code Playgroud) 我目前正在使用.Net中的System.Drawing.Graphics.DrawString()方法在图像上绘制文本,然后将其保存到新文件:
// define image file paths
string sourceImagePath = HttpContext.Current.Server.MapPath("~/img/sourceImage.jpg");
string destinationImagePath = HttpContext.Current.Server.MapPath("~/img/") + "finalImage.jpg";
// create new graphic to draw to
Bitmap bm = new Bitmap(200, 200);
Graphics gr = Graphics.FromImage(bm);
// open and draw image into new graphic
System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(sourceImagePath, true);
gr.DrawImage(sourceImage, 0, 0);
sourceImage.Dispose();
// write "my text" on center of image
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
PrivateFontCollection fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(HttpContext.Current.Server.MapPath("~/fonts/HelveticaNeueLTStd-BlkCn.ttf"));
// prototype (1)
gr.DrawString("my text", …Run Code Online (Sandbox Code Playgroud) 我正在Sencha Touch 2中编写应用程序,作为其中的一部分,我有许多使用ajax代理和json阅读器的商店从我的外部Web服务自动加载.该服务托管在与客户端不同的域上,因此我必须在服务器上设置Access-Control-Allow-Origin才能使其正常工作.
一切都在游戏中使用这个设置,但我正在使用Fiddler查看请求性能,我注意到我的webservice的每次调用实际上都是两次.一旦作为OPTIONS请求,然后再次作为预期的GET.据我所知,OPTIONS请求没有任何用处 - 至少在我的设置中 - 所以我想摆脱它以使加载性能变得更快.
有谁知道这是怎么回事?如果我可以在代理上设置一个可以关闭它的配置,那就太棒了,但我还没有找到它.
谢谢你的期待!
.net ×6
performance ×2
ajax ×1
algorithm ×1
ants ×1
asp.net ×1
c# ×1
caching ×1
compression ×1
debugging ×1
deflate ×1
encryption ×1
gdi ×1
getmessage ×1
graphics ×1
gzip ×1
iis ×1
lru ×1
msbuild ×1
sencha-touch ×1
stack ×1
text ×1
windbg ×1
wpf ×1