2

次のコマンドでプロジェクトをビルドできます...

csc /reference:lib\Newtonsoft.Json.dll SomeSourceFile.cs

...しかし、このコマンドを使用すると...

msbuild MyProject.csproj

... 次の .csproj ファイルには、.dll 参照が含まれていません。何かご意見は?

<PropertyGroup>
    <AssemblyName>MyAssemblyName</AssemblyName>
    <OutputPath>bin\</OutputPath>
</PropertyGroup>

<ItemGroup>
    <Compile Include="SomeSourceFile.cs" />
</ItemGroup>

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
        <HintPath>lib\Newtonsoft.Json.dll</HintPath>
    </Reference>
</ItemGroup>

<Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
</Target>

4

2 に答える 2

5

Reference グループが Csc タスクに接続されていません。また、指定した方法での参照は、タスク内で直接使用できませんでした。MSBuild に同梱されているタスクには、短いアセンブリ名と検索ヒントをファイル パスに変換できる ResolveAssemblyReference が含まれています。中で使われている様子がわかりますc:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets

ResolveAssemblyReference がない場合、最も簡単にできることは、次のように記述することです。

<PropertyGroup> 
    <AssemblyName>MyAssemblyName</AssemblyName> 
    <OutputPath>bin\</OutputPath> 
</PropertyGroup> 

<ItemGroup> 
     <Compile Include="SomeSourceFile.cs" /> 
</ItemGroup> 

<ItemGroup> 
    <Reference Include="lib\Newtonsoft.Json.dll" />
</ItemGroup> 

<Target Name="Build"> 
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" /> 
    <Csc Sources="@(Compile)" References="@(Reference)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" /> 
</Target> 

参照項目は、参照されるアセンブリへの直接パスを指定することに注意してください。

于 2011-11-05T20:17:33.173 に答える
1

あなたが行ったことは、通常 Microsoft.CSharp.targets を介してインポートされる既定の Build ターゲットをオーバーロードすることです。デフォルトの Build ターゲットでは、.cs ソース ファイルが常駐する項目配列 @(Compile) と @(Reference) 配列などを受け取り、C# コンパイラへの適切な呼び出しを合成します。@(Reference) の宣言を効果的に無視し、@(Compile) のみを Csc タスクに提供する、独自の最小限の Build ターゲットでそのようなことを行っていません。

References="@(References)" 属性を Csc タスクに追加してみてください。

于 2011-11-05T20:22:09.563 に答える