标签: csc

解决C#CodeDom在csc.exe中导致堆栈溢出(CS1647)的问题?

我有一种情况需要生成一个带有大字符串const的类.我控制之外的代码导致我生成的CodeDom树被发送到C#源,然后被编译为更大的Assembly的一部分.

不幸的是,我遇到这种情况,如果这个字符串的长度超过Win2K8 x64中的335440个字符(Win2K3 x86中的926240),则C#编译器会以致命错误退出:

致命错误CS1647:在'int'附近编译表达式太长或太复杂

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)

c# compiler-construction codedom csc

7
推荐指数
1
解决办法
7050
查看次数

.NET命令行编译器在哪里?

安装后位于.NET命令行编译器(csc.exe)的位置在哪里?

我正在尝试设置从命令行编译C#应用程序的路径,但我找不到csc.exe的安装位置.

我正在使用.NET 4和Windows 7 Pro 64位.

.net compiler-construction csc

7
推荐指数
1
解决办法
2268
查看次数

如何在.NET中将一个项目编译成多个dll

我试图将一个.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 c# visual-studio-2010 csc

6
推荐指数
1
解决办法
7279
查看次数

从4.0升级到4.5后,MSBuild无法再找到依赖项?

我们有一个.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,这也不起作用.

我发现了一些笔记网上关于微软改变标志OnlyReferenceAndBuildProjectsEnabledInSolutionConfigurationfalsetrue4.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)

c# msbuild csc .net-3.5 .net-4.5

6
推荐指数
1
解决办法
2245
查看次数

无法找到CSC中的源文件

在创建数据库(首先是实体框架,没有实体框架)之后,我们有了一个数据库(以及我们不使用的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)

(另一个也是).现在这些错误消失了 - 这是一种安全的方法吗?

c# asp.net csc nuget-package asp.net-mvc-4

6
推荐指数
1
解决办法
2万
查看次数

CSC和Roslyn编译器的静态lambda表达式评估的区别?

请考虑以下示例代码.

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编译器下)执行相同的代码,则会为DebugRelease设置生成以下输出: …

c# csc roslyn

6
推荐指数
1
解决办法
1260
查看次数

vscode 有 csproj 生成器吗?

我使用 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)

c# msbuild batch-file csc visual-studio-code

6
推荐指数
1
解决办法
6822
查看次数

Visual Studio、MSBuild 和 CSC 之间有什么关系?

我想总体了解Visual StudioMSBuildCSC之间的关系是什么?

我不想了解他们每个人的所有方面。但整体情况还是不错的。

两件重要的事情是:

  • 他们每个人的责任
  • 他们每个人之间的关系

c# msbuild csc visual-studio

6
推荐指数
1
解决办法
1843
查看次数

Octopack 将 csc.exs 放入双 bin 文件夹中

我刚刚开发了一个小型内部应用程序,并使用 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

csc bin roslyn octopus-deploy octopack

6
推荐指数
1
解决办法
167
查看次数

CSC:警告 RSG002:未为附加文件指定 TargetPath

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)

问题

  1. 所有开发人员都需要具有相同的本地文件结构吗?
  2. 例如,如果谢尔顿使用C:\dev\foo拉吉和霍华德是否不允许使用d:\mycode\bar\foo
  3. 如何指定 TargetPath?
  4. 或者换句话说,我必须做什么才能消除警告的原因?

.net c# csc razor asp.net-core

5
推荐指数
1
解决办法
1483
查看次数