我有一种情况需要生成一个带有大字符串const的类.我控制之外的代码导致我生成的CodeDom树被发送到C#源,然后被编译为更大的Assembly的一部分.
不幸的是,我遇到这种情况,如果这个字符串的长度超过Win2K8 x64中的335440个字符(Win2K3 x86中的926240),则C#编译器会以致命错误退出:
MSDN称CS1647是"编译器中的堆栈溢出"(没有双关语!).仔细观察我已经确定CodeDom"很好地"将我的字符串const包装在80个字符处.这导致编译器连接4193个字符串块,这显然是x64 NetFx中C#编译器的堆栈深度.CSC.exe必须在内部递归计算此表达式以"重新水化"我的单个字符串.
我最初的问题是:"有没有人知道改变代码生成器如何发出字符串的解决办法? "我无法控制外部系统使用C#source作为中间件的事实,我希望这是一个常量(而不是而不是字符串的运行时串联).
或者,我该怎么制定这个表达式使得一定数量的字符后,我仍然能够创造一个恒定的,但它是由多个的大型块?
完整的repro在这里:
// this string breaks CSC: 335440 is Win2K8 x64 max, 926240 is Win2K3 x86 max
string HugeString = new String('X', 926300);
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
CodeCompileUnit code = new CodeCompileUnit();
// namespace Foo {}
CodeNamespace ns = new CodeNamespace("Foo");
code.Namespaces.Add(ns);
// public class Bar {}
CodeTypeDeclaration type = new CodeTypeDeclaration();
type.IsClass = true;
type.Name = "Bar";
type.Attributes = MemberAttributes.Public;
ns.Types.Add(type);
// public const string HugeString …Run Code Online (Sandbox Code Playgroud) 安装后位于.NET命令行编译器(csc.exe)的位置在哪里?
我正在尝试设置从命令行编译C#应用程序的路径,但我找不到csc.exe的安装位置.
我正在使用.NET 4和Windows 7 Pro 64位.
我试图将一个.Net c#项目编译成多个dll.但事情就是这样.
这是我的项目结构.
Bin
Dir1
Dir2
File1.cs
File2.cs
myproject.csproj
Run Code Online (Sandbox Code Playgroud)
我想将此项目编译为File1.dll和File2.dll.File1.dll和File2.dll都使用Dir1和Dir2中的各种.cs文件中的代码.子目录中存在的.cs文件中的一些类是File1.cs所必需的,其他类是File2.cs.File1.cs和File2.cs都会使用一些.
我使用了以下内容:
csc /t:library /out:File1.dll /recurse:*.cs
csc /t:library /out:File2.dll /recurse:*.cs
Run Code Online (Sandbox Code Playgroud)
但是由此产生的dll是彼此的精确副本,只有不同的文件名.有没有办法让我编译它们,以便当我在对象浏览器中检查每个dll时,它只有Dir1和Dir2中.cs文件中的那些类,它们在File1.cs中为File1.dll引用,类似于File2.dll?
我想这样做最好是作为Visual Studio中的后期构建步骤的一部分.
谢谢你的时间...
编辑
感谢您的所有回复.有很多建议将解决方案分成许多项目.虽然这是一种方法,但我不确定我是否想要为两个dll创建任何依赖项,即File1.dll和File2.dll.让我解释..
我在创建多个项目时遇到的问题是File1.cs和File2.cs都需要一些代码.我不希望它们在两个项目中重复出现.将公共代码保存在第三个项目中意味着将创建File1.dll和File2.dll所需的第三个dll.我不想要这个.我只想创建File1.dll和File2.dll,这就是我将它们保存在一个项目中的原因.有关如何实现这一目标的任何建议?
再次感谢您的回复.
干杯.
我们有一个.Net 3.5应用程序,它是使用一些调用的脚本构建的 msbuild.exe
最近我们所有的机器都开始自动从.Net 4.0更新到.Net 4.5作为公司范围内的政策的一部分,我们的构建脚本开始失败.
给出的错误是他们找不到引用的程序集,如下所示:
error CS0012: The type 'System.Drawing.Image' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
看起来在每种情况下,我们都尝试构建具有对项目B的引用的项目A,并且项目B具有对库X的引用,并且获得项目A需要对库X的引用的错误.
一个临时的解决方法是卸载4.5,卸载4.0,然后重新安装4.0,但这是耗时的,并且在更新通常是静默和自动的环境中不实用.
我已经尝试过使用以下msbuild交换机,没有运气
/toolsversion:3.5- Func未定义的例外情况/toolsversion:4.0 - 因为4.5替换了4.0工具不起作用/p:TargetFrameworkVersion="v3.5" - 同样的错误/p:VisualStudioVersion=11.0 - csproj文件中的相同错误*` - 已经存在,同样的错误.csproj文件已<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>在我的解决方案中的每个csproj文件中指定,并且ToolsVersion="4.0".
我也尝试将更TargetFrameworkVersion改为4.0,这也不起作用.
我发现了一些笔记网上关于微软改变标志OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration从false到true4.0至4.5升级过程中,但是手动设置该标志中的csproj文件还没有解决的问题.
<OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
false
</OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
Run Code Online (Sandbox Code Playgroud)
为什么msbuild在从4.0升级到4.5后无法找到这些子程序集,我该如何解决?
更新
我终于找到了问题的根源,但我不知道这是怎么回事.
ProjectA有一个类,它继承自ProjectB中的抽象类,其中一个属性ProejctB.BaseClass是类型System.Drawing.Image.
namespace ProjectA
{
public …Run Code Online (Sandbox Code Playgroud) 在创建数据库(首先是实体框架,没有实体框架)之后,我们有了一个数据库(以及我们不使用的EntityModel_HFFContext文件,它没有连接).正常工作继续进行,我为MVC站点地图安装了一个NuGet包.
从那一刻开始,该项目运行良好,但几天之后,两个文件丢失了两个警告:"无法在项目文件中找到文件'locatie.cs'的父文件'EntityModel_HFF.tt'. " ("HFF"是这里的项目名称),然后那些成倍增加错误: "无法找到"源文件'locatie.cs'在我找不到的CSC文件中.
这两个文件('locatie.cs'和'klant.cs')不在任何视图中,但不知何故它们显示在所有文件夹之外,表示它们不会被激活(请参阅此screencapture).我试图手动删除这些文件,但没有任何成功.我也尝试了其他一些方法,但这导致了数据库的完全删除,所以现在我有点绝望了.
我不知道在哪里查看和做什么,摆脱这两个文件(或者可能是对这些文件的引用,因为我们根本不使用它们),所以我不再有这些错误了.有没有人知道我需要查看的位置(例如,这个CSC文件的位置)以及我需要调整以解决这个问题?
也许知道我使用Visual Studio 2013会很有用.
更新
我通过卸载项目,编辑.csproj文件和注释掉来修复错误
<Compile Include="klant.cs">
<DependentUpon>EntityModel_HFF.tt</DependentUpon>
</Compile>
Run Code Online (Sandbox Code Playgroud)
(另一个也是).现在这些错误消失了 - 这是一种安全的方法吗?
请考虑以下示例代码.
class Program
{
static void Main( string[] args )
{
DoSomethingWithAction( i =>
{
Console.WriteLine( "Value: {0}", i );
} );
Console.ReadLine();
}
private static void DoSomethingWithAction( Action<int> something )
{
Console.WriteLine( something.Target == null
? "Method is static."
: "Method is not static." );
something( 5 );
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Visual Studio 2010(在CSC编译器下)编译并在Debug下运行此代码,它将打印出以下结果:
Method is not static.
Value: 5
Run Code Online (Sandbox Code Playgroud)
如果我在Visual Studio 2010中编译相同的代码,但这次使用Release设置,将生成以下输出:
Method is static.
Value: 5
Run Code Online (Sandbox Code Playgroud)
现在,如果我们要使用Visual Studio 2015 CTP(在Roslyn编译器下)执行相同的代码,则会为Debug和Release设置生成以下输出: …
我使用 Visual Studio Code 是因为它比 Visual Studio 更轻量级,但仍然提供智能感知功能。但是我找不到代码自动构建 .csproj 或 .sln 的方法,所以我一直从头开始制作文件。关于它的文档很少,所以我不得不放弃其他文件中的示例。一切都很好,但最近我遇到了一个障碍,用 msbuild 编译它并不能得到与 csc.exe 编译相同的结果。每当我加载 dll 并尝试使用它的类之一时,我都会收到 BadImageFormatException。我的问题是,有没有办法让 vscode 在我创建新项目时生成 csproj 或 sln 文件?如果没有,是否有办法让我以与批处理文件相同的方式编译 csproj 文件?
csproj 文件:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Drawing" />
<Reference Include="Splicer.dll">
<HintPath>Splicer.dll</HintPath>
</Reference>
<Reference Include="DirectShowLib-2005.dll">
<HintPath>DirectShowLib-2005.dll</HintPath>
</Reference>
<Compile Include="src\*.cs" />
</ItemGroup>
<Target Name="Build">
<MakeDir Directories="$(OutputPath)"
Condition="!Exists('$(OutputPath)')"
/>
<Csc
Platform="x86"
NoWarn=""
Sources="@(Compile)"
OutputAssembly="$(OutputPath)$(AssemblyName).exe"
/>
</Target>
<PropertyGroup>
<AssemblyName>SplicerDemo</AssemblyName>
<OutputPath>bin\</OutputPath>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)
批处理编译器:
@echo off
set "CSC=C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
set "Refs=Splicer.dll,DirectShowLib-2005.dll"
set …Run Code Online (Sandbox Code Playgroud) 我想总体了解Visual Studio、MSBuild和CSC之间的关系是什么?
我不想了解他们每个人的所有方面。但整体情况还是不错的。
两件重要的事情是:
我刚刚开发了一个小型内部应用程序,并使用 Octopus Deploy 作为部署软件。我已经使用八达通很多年了,没有出现任何问题。然而,我刚刚遇到了一个相当奇怪的“东西”,这让我有点难住了!打包时,Roslyn 文件夹被放入 bin/bin/ 文件夹中。所以我得到以下错误:“无法找到路径'XXXXXX \ bin \ roslyn \ csc.exe的一部分”这是因为csc.exe是双bin文件夹:bin / bin / roslyn / csc.exe在解决方案中正如预期的那样,Roslyn 位于一个 bin 文件夹中。不知何故,当对解决方案进行 Octopacking 时,它会创建一个双 bin 文件夹。我以前从未遇到过这个。
我已经删除了 obj 和 bin 文件夹,清理了解决方案并重建了解决方案,它仍然创建了一个双 bin 文件夹。我使用的是 VS 2017 版本:15.8.1
使用.net-6.0 的dotnet buildrazor 页面应用程序的命令会抛出很多警告,例如
CSC : warning RSG002: TargetPath not specified for additional file:
C:\dev\Foo\Foo\Pages\Admin\Administration\Users\Delete.cshtml.
[C:\dev\Foo\Foo\Foo.csproj]
.... lots of other files with the same warning
Run Code Online (Sandbox Code Playgroud)
这是我的构建引擎
C:\dev\Foo\Foo>dotnet build
Microsoft (R) Build Engine version 17.0.0+c9eb9dd64 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
Run Code Online (Sandbox Code Playgroud)
C:\dev\foo拉吉和霍华德是否不允许使用d:\mycode\bar\foo?