質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1523閲覧

MSBuildのカスタムタスクが動かない

user111

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

2クリップ

投稿2021/11/14 00:45

前提・実現したいこと

ビルド実行時にカスタムタスクを動かしたいのですが動きません。

このあたりこのあたりを参考にやっているのですがうまいこと動きません。

ビルド等でエラーが出ているわけではなく、以下SampleTask が呼び出されていないように見えます。
理由は
・SampleTaskにブレイクポイントを貼っても止まらない
・UsingTaskのAssemblyFileに存在しないファイル名を指定してもエラーにならない
上記の理由から、そもそもUsingTaskが呼び出されていないのでは、、、と考えています。
どの様にすれば呼び出せるようになるでしょうか。

よろしくおねがいします。

試したこと

  1. コンソールアプリ作成
  2. 「Microsoft.Build.Framework」と「Microsoft.Build.Utilities.Core」をNugetでインストール
  3. Microsoft.Build.Utilities.Taskを継承してカスタムタスククラス(SampleTask)作成
  4. カスタムタスクを呼び出すようprojectファイル修正

○Program.cs

c#

1using System; 2 3Console.WriteLine("Hello, World!");

○SampleTask.cs

c#

1using Microsoft.Build.Utilities; 2 3namespace ConsoleApp4 4{ 5 public class SampleTask : Task 6 { 7 public override bool Execute() 8 { 9 System.Console.WriteLine("Sample実行"); 10 return true; 11 } 12 } 13}

○ConsoleApp4.csproj

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>disable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Build.Framework" Version="17.0.0" /> <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.0.0" /> </ItemGroup> // ココを追加 <UsingTask TaskName="ConsoleApp4.SampleTask" AssemblyFile=".\ConsoleApp4.dll"/> <Target Name="Sample"> <SampleTask /> </Target> </Project>

補足情報(FW/ツールのバージョンなど)

VisualStudio2022 RC3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

user111

2021/11/15 12:42

こんばんわ、情報ありがとうございます。 その辺りの話です。 一応動いたので自己解決にまとめます
guest

回答1

0

自己解決

TN8001さんにいただい情報そのままですが
ココを参考にプログラムの修正を行いました。

UsingTaskのConsoleApp4.dllが呼び出されてなさそうな件は
参考にしたPGを元にTargetに以下を追加でエラーが出るようになった

BeforeTargets="Build"

<UsingTask TaskName="ConsoleApp4.SampleTask" AssemblyFile=".\ConsoleApp4.dll"/> <Target Name="Sample" BeforeTargets="Build"> <SampleTask /> </Target>

この状態でビルドすると、以下のエラーが発生
"ConsoleApp4.SampleTask" タスクをアセンブリC:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4.\ConsoleApp4.dll から読み込めませんでした。

で、参考PGを見てみると
Taskクラスを別プロジェクトに分けてあったので、プロジェクトの分割を実施

この際切り出したプロジェクトのターゲットフレームワークを
netstandard2.0にする必要あり

○切り出したプロジェクト
ClassLibrary1.csproj

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!--netstandard2.0を指定する--> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Build.Framework" Version="17.0.0" /> <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.0.0" /> </ItemGroup> </Project>

SampleTask.cs

using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace ClassLibrary1 { public class SampleTask : Task { public override bool Execute() { // ココも参考に合わせて修正 Log.LogMessage(MessageImportance.High, "Sample実行"); return true; } } }

○元のプロジェクト
ConsoleApp4.csproj

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>disable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <!--ClassLibrary1を指定--> <UsingTask TaskName="ClassLibrary1.SampleTask" AssemblyFile="C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ClassLibrary1.dll" /> <Target Name="SampleTask" BeforeTargets="Build"> <SampleTask /> </Target> </Project>

Program.cs

using System; Console.WriteLine("Hello, World!");

この状態でビルドをすると

2>ConsoleApp4 -> C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll 2>Sample実行 ←正しく出力された 2>プロジェクト "ConsoleApp4.csproj" のビルドが終了しました。

ちなみに、VisualStudioからではなくコマンドラインから実行すると
ClassLibrary1のターゲットフレームワークが.net6でも動く

ClassLibrary1.csproj

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!--net6.0に変更--> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Build.Framework" Version="17.0.0" /> <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.0.0" /> </ItemGroup> </Project>

コマンドラインからビルド実行

PS C:\Users\xxx\source\repos\ConsoleApp4> dotnet build .\ConsoleApp4.sln .NET 向け Microsoft (R) Build Engine バージョン 17.0.0+c9eb9dd64 Copyright (C) Microsoft Corporation.All rights reserved. 復元対象のプロジェクトを決定しています... 復元対象のすべてのプロジェクトは最新です。 ClassLibrary1 -> C:\Users\xxx\source\repos\ConsoleApp4\ClassLibrary1\bin\Debug\net6.0\ClassLibrary1.dll ConsoleApp4 -> C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll Sample実行 ←正しく出力された ビルドに成功しました。

投稿2021/11/15 14:01

user111

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問