我正在与C#项目上的一个小型(4人)开发团队合作.我已经提议建立一个构建机器,它将对项目进行夜间构建和测试,因为我知道这是一件好事.麻烦的是,我们这里没有足够的预算,所以我必须证明费用是合理的.所以我想知道:
我意识到这是一个非常大的话题,我刚刚开始.我在这里找不到这个问题的副本,如果那里有一本书我应该得到,请告诉我.
编辑:我终于开始工作了!Hudson非常棒,FxCop表明我们认为实现的一些功能实际上是不完整的.我们还必须将安装程序类型从Old-And-Busted vdproj更改为New Hotness WiX.
基本上,对于那些正在关注的人,如果你可以从命令行运行你的构建,那么你可以把它放到哈德森.通过MSBuild从命令行运行构建本身就是一个很有用的练习,因为它会强制你的工具是最新的.
我刚从vs2008切换到vs2010.完全相同的解决方案,除了现在每次调用C++ dll都会产生'pinvokestackimbalance'异常.
此异常在2008年不会被触发.我可以完全访问C++ dll和调用应用程序.pinvoke似乎没有任何问题,但是这个问题使调试其他问题变得不可能; IDE经常停下来告诉我这些事情.
例如,这是C#签名:
[DllImport("ImageOperations.dll")]
static extern void FasterFunction(
[MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage,
[MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage,
int inTotalSize, int inWindow, int inLevel);
Run Code Online (Sandbox Code Playgroud)
这是C++方面的样子:
#ifdef OPERATIONS_EXPORTS
#define OPERATIONS_API __declspec(dllexport)
#else
#define OPERATIONS_API __declspec(dllimport)
#endif
extern "C" {
OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray,
unsigned char* outRemappedImage,
int inTotalSize,
int inWindow, int inLevel);
}
Run Code Online (Sandbox Code Playgroud)
vs2010和vs2008之间有什么不同会导致这些异常被抛出?我应该在DllImport指令中添加一组不同的参数吗?
这是C#的详细问题.
假设我有一个带有对象的类,并且该对象受到锁的保护:
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
return property;
}
set {
property = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要一个轮询线程来查询该属性.我还希望线程偶尔更新该对象的属性,有时用户可以更新该属性,并且用户希望能够看到该属性.
以下代码是否会正确锁定数据?
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
lock (mLock){
return property;
}
}
set {
lock (mLock){
property = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过'正确',我的意思是,如果我想打电话
MyProperty.Field1 = 2;
Run Code Online (Sandbox Code Playgroud)
或者其他什么,我会在更新时锁定该字段?设置是由'get'函数范围内的equals运算符完成的,还是'get'函数(因此锁定)首先完成,然后设置,然后'set'被调用,从而绕过锁?
编辑:由于这显然不会做的伎俩,会是什么?我是否需要做以下事情:
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
MyObject tmp = null;
lock …
Run Code Online (Sandbox Code Playgroud) 我已经对存储库进行了一些更改,并且它们被其他人还原(它们在Windows上编译但在linux上不编译).我认为这些变化仍然在历史中,但我怎样才能恢复这些变化,修复它们,然后重新提交?
我有一个用于图像处理的应用程序,我发现自己通常会分配4000x4000 ushort大小的数组,以及偶尔浮点数等.目前,.NET框架在这个应用程序中往往会随机崩溃,几乎总是出现内存不足错误.32mb不是一个巨大的声明,但如果.NET碎片化内存,那么这种大型连续分配很可能不会像预期的那样运行.
有没有办法告诉垃圾收集器更积极,或碎片整理内存(如果这是问题)?我意识到有GC.Collect和GC.WaitForPendingFinalizers调用,我通过我的代码非常自由地散布它们,但我仍然得到错误.这可能是因为我正在调用使用本机代码的dll例程,但我不确定.我已经查看了那个C++代码,并确保我声明删除的任何内存,但我仍然得到这些C#崩溃,所以我很确定它不存在.我想知道C++调用是否会干扰GC,使其留下内存,因为它曾经与本机调用交互 - 这可能吗?如果是这样,我可以关闭该功能吗?
编辑:这是一些非常具体的代码,将导致崩溃.根据这个问题,我不需要在这里处理BitmapSource对象.这是天真的版本,没有GC.Collects.它通常在撤销过程的迭代4到10上崩溃.这段代码替换了空白WPF项目中的构造函数,因为我使用的是WPF.由于我在下面对@dthorpe的回答中解释的限制以及此SO问题中列出的要求,我对bitmapsource做了一些古怪的事情.
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
//Attempts to create an OOM crash
//to do so, mimic minute croppings of an 'image' (ushort array), and then undoing the crops
int theRows = 4000, currRows;
int theColumns = 4000, currCols;
int theMaxChange = 30;
int i;
List<ushort[]> theList = new List<ushort[]>();//the list of images in the undo/redo stack
byte[] displayBuffer = null;//the buffer used as a …
Run Code Online (Sandbox Code Playgroud) 我正在浏览各种WPF文档,我感到不必要的困惑."业务逻辑"这个术语分散在其中,好像每个人都应该知道它是什么.
根据这个问题,我可以看到什么是业务逻辑: 应用程序中究竟什么是"业务逻辑"?
但这个词来自哪里?为什么它被称为"业务逻辑"而不是"核心逻辑"或"主要算法"或任何其他更通用的术语?我编写的程序很少与"业务逻辑"有关,当我想到"业务逻辑"时,我会想到处理信用卡交易,客户数据库维护等的事情.换句话说,与整个计算机科学的一小部分有关的事情.当我写一个成像应用程序时,没有涉及"业务",没有客户,没有基于货币的交易,没有类似的东西.所以说我有'业务逻辑'真的让我困惑,因为我没有开展业务,我正在处理图像.
如何在WPF中更改按钮的默认文本换行样式?
显而易见的解决方案:
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
<Setter Property="TextWrapping" Value="Wrap"></Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
不起作用,因为Textwrapping显然不是一个可设置的属性.
如果我尝试:
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我只是从编译器得到一个毫无价值的回应:
Error 5 After a 'SetterBaseCollection' is in use (sealed), it cannot be modified.
Run Code Online (Sandbox Code Playgroud)
删除ControlTemplate标记可以保留错误.
以下尝试会产生不同的错误:
<Setter Property="TextBlock">
<TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
</Setter>
Error 5 The type 'Setter' does not support direct content.
Run Code Online (Sandbox Code Playgroud)
我看到我可以单独为每个按钮设置textwrapping,但这很漂亮.我该怎么做才能成为一种风格?有什么神奇的话语?
为了将来参考,我在哪里可以找到这些神奇单词的列表,所以我可以自己做这个?当我试图找出setter可以设置哪些属性时,MSDN条目是没用的.
我有一个脚本将文本文件转换为资源文件,这样我可以通过将不同语言的文本文件转换为不同的资源来支持多种语言.一旦我运行脚本来获取resx文件,我就必须运行自定义构建工具(如此处所述:链接到代码项目),以便创建Designer.cs
使用新文件的文件.
按照我应该能够通过单击按钮构建整个项目的理念,如何删除我必须显式调用自定义构建工具以生成代码隐藏文件的步骤?
我已经尝试自动删除Designer.cs
文件作为预构建步骤,因为我认为如果没有Designer.cs文件,但没有骰子,自定义构建工具会自动运行.
所以,我想在Visual Studio/msbuild中构建脚本:1)将文本转换为resx(完成)2)将resx文件移动到适当的目录(完成)3)使用自定义构建工具创建designer.cs文件(未完成) )
这是最后一步......
我正在使用MessageBox类向用户显示错误,虽然这可能不是正确的行为,但它非常方便.这是一个触摸屏应用程序,所以我需要'ok'按钮比它大得多(诅咒我非常大的手指!).
我想如果我在对话框中增加字体大小,我应该没问题.有没有办法做到这一点?或者真的,有没有办法增加对话框的大小?
谢谢
我正在尝试使用WiX检测.NET的安装版本.我试过了:
<Condition Message='This setup requires the .NET Framework 3.5 or higher.'>
<![CDATA[MsiNetAssemblySupport >= "3.5.0.0"]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为MsiNetAssemblySupport属性检查的版本fusion.dll
是从.NET 3.0或3.5版本2.0中更新的.
检查系统目录中是否存在.NET库是否可行?我怎么用WiX做到这一点?或者有一些方法可以使用注册表吗?
(我意识到有一个WiX用户电子邮件列表,但这是Oughts--我不喜欢80年代的技术,我喜欢我可以轻松搜索的东西.)