Tag: msbuild

MSBuild条件编译

我有一个Web服务类,框架的其余部分依赖于获取其数据,但Web服务类需要具有不同的方法属性,具体取决于它所处的环境。例如…… [SoapDocumentMethodAttribute(“https://example”,…)] public string Test() { //doSomething } 看到“ https:// example ”? 这需要根据环境而改变。 AFAIK你不能让那个字符串为运行时动态,它必须以这种方式编译。 所以我试图得到它,以便我有这个Web服务的多个CS文件,其中有不同的属性URL硬编码,并且MSBuild在预编译时交换它们。 所以我有一个基础“Service.cs”用于测试,“Service.cs.production”用于生产环境,等等。 这是最好的方法吗,或者我错过了一些我可以拥有一个CS来处理环境的东西? 为了保持具有相同的类名和IntelliSense不认为事情是模棱两可的,我正在弄乱文件扩展名(“Service.cs”与“Service.cs.production”)。 这是唯一的方法吗? 考虑到上述所有情况都可以,并且我正在编译“生产”配置,它可以编译Service.cs.production 而不是 Service.cs,一切都变得很糟糕吗? 谢谢!

通过UInt16屏障对assembly信息进行版本控制

在过去,我通常使用变更集或svn编号对二进制文件进行版本控制,例如1.1.123.3,其中大数字是源控制系统的变更集或转速。 但是,随着系统即将使用,我们已经远远超过了70000+变更集之类的uint障碍,因此当用作asssembly版本属性或汇编文件版本属性时会导致溢出和编译器错误。 请参阅: http : //msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx 还有哪些替代策略仍将二进制文件链接到变更集? 我调整了我的任务,使用给出的解决方案: $(Branch).$([MSBuild]::Subtract($(ChangeSet),$(Offset))).$(OffsetCount)

如何自动将版本号插入AssemblyName

我正在努力建立这个问题: 从MSBuild中的文件中读取单个值 我的目标是有一个地方放置在多个项目中使用的版本号,我还想要其中一个项目的DLL文件名中的部分版本号。 基于上面的问题,我已经得到了第一部分,但我对第二部分遇到了困难,并希望得到一些指导。 在我的解决方案中,我设置了一个名为Version.txt的纯文本文件,仅包含我的完整版本号: 1.1.0.0 在我的两个项目中,我打开了AssemblyInfo.cs文件并删除了AssemblyVersion和AssemblyFileVersion项,然后修改了两个项目以在单独的文件中生成它们,如上面的问题所述。 现在,当我构建时,我为每个项目生成一个生成的Properties \ Version.cs文件,该文件用于构建EXE / DLL并在其文件属性中显示为“1.1.0.0”。 这正是我想要的。 对于DLL,我想命名程序集“filename.v1.1.dll”,其中“1.1”来自上面Version.txt中的前两个组件。 只要我能在EXE / DLL属性中获得完整的“1.1.0.0”并在DLL文件名中获得“1.1”,我就可以灵活地使用Version.txt的格式。 为了试试这个,我修改了DLL的csproj文件,使其具有: dllfile dllfile.v$(VersionNumber) 当然,这会在文件名中插入完整版本号,这是我不想要的。 有没有人有关于如何进行的任何提示? 谢谢。 编辑:我已经能够通过将以下内容添加到我的.csproj BeforeBuild目标中来提取版本号的主要/次要组件: $(VersionNumber.IndexOf(‘.’)) 0 $(VersionNumberFirstDotIndex) $([MsBuild]::Add(1, $(VersionNumberFirstDotIndex))) $(VersionNumber.IndexOf(‘.’, $(VersionNumberMinorStart))) $([MSBuild]::Subtract($([MSBuild]::Subtract($(VersionNumberSecondDotIndex), $(VersionNumberFirstDotIndex))), 1)) $(VersionNumber.Substring($(VersionNumberMajorStart), $(VersionNumberMajorLen))) $(VersionNumber.Substring($(VersionNumberMinorStart), $(VersionNumberMinorLen))) $(VersionNumberMajor).$(VersionNumberMinor) 我现在唯一缺少的是如何将此VersionNumberShort转换为DLL文件名。 除非有人有更好的想法,否则我可以采取Peter的建议并使用Move任务: 由于我需要与以前相同的属性定义,因此我将上面的代码段移动到“Common”目标中,并在此处显示的构建和清理任务中引用它。 彼得 – 如果你想把你的评论作为答案,我会接受它。 谢谢! 编辑:按照jdlugosz的回答,我尝试在我的任务中设置AssemblyName。 不幸的是,根据顶部列出的原始示例,这似乎仍然没有任何影响: … dllfile.v$(VersionNumber) 我尝试从Visual Studio Developer命令提示符运行MSBuild: msbuild […]

使用Roslyn编译xaml

简短的故事:有没有办法使用Roslyn编译器来编译WPF UserControl? 假设你想要编译一个包含标准C#代码和WPF控件(XAML和xaml.cs文件)的程序集,当然没有任何csproj。 我在网上发现了很多关于如何使用Roslyn编译DLL的内容,没有关于如何处理XAML文件的内容? 我知道Visual Studio(或MSBuild)会创建一个临时生成的文件,并在生成的程序集中嵌入一个BAML文件。 所以,如果我能找到一种生成这个中间文件的方法,我可以使用它,但我发现的只是PresentationBuildTasks.MarkupCompilePass,最终需要一个csproj(好吧,我可能会动态生成一个项目,但我希望找到更简单的东西)。 谢谢你的帮助。

使用msbuildworkspace打开解决方案会在没有详细信息的情况下发出诊断错

我正在尝试使用MSBuildWorkspace分析Roslyn的解决方案。 该解决方案是一种新的解决方案,其中包含2个类库项目,一个引用另一个。 它们是在Visual Studio 2017中创建的.Net 4.6.2。 当我打开解决方案时,我在workspace.Diagnostics中收到两个通用错误,两者都是:处理文件’ PathToProject时Msbuild失败’在诊断或输出窗口中没有更多内容,表明它为什么处理项目文件失败。 打开解决方案的代码: namespace RoslynAnalyse { class Program { static void Main(string[] args) { LocalAnalysis(); } private static void LocalAnalysis() { var workspace = MSBuildWorkspace.Create(); var solution = workspace.OpenSolutionAsync(@”D:\Code\Roslyn\RoslynAnalyse\SolutionToAnalyse\SolutionToAnalyse.sln”).Result; var workspaceDiagnostics = workspace.Diagnostics; } } } Microsoft.CodeAnalysis的版本是2.0.0.0。 有没有人知道为什么MSBuild失败了,我怎么能获得更多信息?

使用新的csproj在PDB中嵌入C#源代码

最近发布的.NET工具似乎支持在PDB中嵌入C# ,这应该可以改善步入第三方等的体验。运行csc /? ,我可以清楚地看到/ embed选项:“将所有源文件嵌入到PDB中。” 但是,似乎没有任何方法可以在csproj中指定它。 更重要的是,似乎没有任何规定将任意开关传递给编译器,我将用它来手动传递/嵌入。 任何人都可以确认我没有错过任何内容,并且目前缺乏对/ embed的构建支持吗? 这是否存在问题(如果没有问题)? 任何建议的解决方法也将不胜感激。

Visual Studio在构建之后在“bin”中创建“x86”子文件夹的时间和原因?

我有一个包含3个可执行项目的许多项目的解决方案。 我的所有项目都配置为目标“x86”平台,在解决方案配置管理器中我甚至删除了其他像“混合”和“任何CPU”(这是因为我正在使用一些限制我的第三方库坚持使用x86)。 所有3个可执行项目都是使用C#构建的简单WinForms应用程序,目标是.NET 4完整配置文件。 现在当我构建我的一个可执行项目时,它的输出内置在“bin / x86 / Release”目录中。 当我构建另一个可执行项目时,其输出内置在“bin / Release”中,没有“x86”子文件夹。 为什么这 – 乍一看 – 不一致? UPDATE 我需要修复它,因为我想在成功构建之后运行一些脚本,并且它们会期望输出处于一致的文件夹结构中。

无法从用法中推断出方法的类型参数

namespace TestLibrary { [TestFixture] public class Class1 { public delegate T Initializer(); public static T MyGenericMethod(Initializer initializer) where T : class { return initializer != null ? initializer() : null; } [Test] public void Test() { var result = MyGenericMethod(MyInitializer); Assert.IsNotNull(result); } private object MyInitializer() { return new object(); } } } 在Visual Studion 2010中运行时,这是一段正常运行的代码。如果我尝试使用MSBUILD从命令行构建它… […]

MSBuild Post-Build

我有一个MSBuild脚本,除了我的后期构建步骤之外,还要执行我需要做的所有事情(请参阅我之前提出的问题: MSBuild条件Exec? )。 我正在寻找的是构建许多csproj文件,并且当且仅当项目构建时,可选择执行构建后步骤。 我不想一直执行我的后期构建步骤,否则我的最终输出上的时间戳将被不必要地修改(并且它使构建过程非常耗时而无缘无故)。 在我的MSBuild脚本中,我为每个csproj文件提供了以下内容: 编辑:我认为我真正想做的是检测CoreCompile任务何时为每个项目运行。 如果在某种情况下有某种方法来检查这个问题? 有任何想法吗? 我是MSBuild的新手,所以也许我完全走错了轨道! 谢谢,艾伦

如何在dll中包含源代码?

简短版本:我希望我的程序能够(只读)在运行时访问自己的源代码。 有没有办法在编译期间自动将源代码打包到dll中? 长版: 背景是当发生exception时,我想自动创建一个包含所发生事件细节的文件。 除其他外,此文件应包括导致问题的函数的源代码。 我想通过电子邮件将此文件发送给其他人,并且接收者很可能没有(或者不想安装)Visual Studio,因此任何使用符号服务器等的东西都是不可能的。 它需要是纯文本文件。 理想情况下,我会找到相关的源代码文件,只需复制相关的行。 你可以放心地假设,只要我有一个包含整个源代码的文件夹,我就能找到我想要的文件和行。 到目前为止我能想出的最好的想法 – 而且我没有详细研究它,因为它看起来很乱 – 无论如何都是修改MSBuild文件以在编译期间创建源的.zip,并且需要.dll和.zip驻留在同一个文件夹中。 我发现的大多数关于stackoverflow的类似问题似乎都在处理反编译 .dll文件,这不是我想要做的。 我有源代码,我想以方便的方式将它与.dll一起发送。 更新:非常长的版本 似乎有些人严重质疑我为什么要这样做,所以这里的答案是:我的软件的主要目的是测试其他一些软件。 其他软件有GUI。 举个简单的例子,让我们说其他软件是标准的Windows计算器,那么我的测试用例可能看起来像这样: calculator.Open(); calculator.EnterValue(13); calculator.PressButtonPlus(); calculator.EnterValue(38); calculator.PressButtonEnter(); int value = calculator.GetDisplayedValue(); Assert.That(value == 51); calculator.Close(); 这些测试是以人类可读的方式有意编写的。 出现问题时我想要做的是给计算器的开发者一个关于如何重现问题的详细描述, 以一种他可以在没有我的软件的情况下手工复制的方式 。 (在这个例子中,他会打开计算器,输入13,按加号,依此类推。) 也许另一种选择是将每个函数calculator.Something()写出一条信息行到日志中,但这样做a)需要做更多的工作,b)只包括测试运行到它中止的点,并且c)承担一种风险,即在一个函数中忘记写入该行,从而对所做的事情给出不正确的表示。 但我对其他解决方案持开放态度,而不是复制源代码。