概要
Revit.AsyncはRevitAPIで非同期処理を使用するときに必要なライブラリです。こちらのライブラリを使用した際に詰まったポイントを詳しく解説します。同じような問題に直面している方の参考になれば幸いです。
環境
VS2019
Revit2022
.Net Framework4.8
Revit.Asyncの導入
Revit.AsyncのライブラリはNugetを使用してプロジェクトにインストールします。
「ツール」→「NuGet パッケージ マネージャー」→「ソリューションの NuGet パッケージの管理」でパッケージ管理画面を開いて「Revit.Async」と検索することで出てきます。バージョンは最新のものをインストールします。
Revit.Asyncの実装
こちらのサイトを参考にしながらコードを実装します。今回のコードの目的は、Revitを起動したら 1 秒間待機し、その後「await」という文字を持つディスプレイを表示することです。
using Autodesk.Revit.UI;
using Revit.Async;
using System.Threading.Tasks;
namespace QiitaRevitTask
{
public class Class1 : IExternalApplication
{
public Result OnStartup(UIControlledApplication application)
{
//非同期処理の準備
RevitTask.Initialize(application);
RevitTask.RunAsync(async () =>
{
//1秒待つ
await Task.Delay(1000);
TaskDialog.Show("Title", "await");
});
return Result.Succeeded;
}
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
}
}
警告
OnShutdownメソッドに書き込まないように注意してください(三敗)
実行
実装したコードをビルドし、必要なアドインファイルを生成した後、Revitのアドインディレクトリに .addin ファイルと.dll ファイルを配置してRevitを実行します。すると画像のようにSystem.IO.FileNotFoundExceptionのエラーが発生します。
エラー: System.IO.FileNotFoundException:
ファイルまたはアセンブリ 'Revit.Async, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null' が見つかりません。
Exception was thrown from the ExternalCommand - System.IO.FileNotFoundException:
Could not load file or assembly 'Revit.Async, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null'.
The system cannot find the file specified.
エラー文を要約すると「Revit.Asyncのライブラリが見つからない」と言っています。
いやなんでNugetしたライブラリが見つからなくなるんだよ
解決策
このエラーはビルドした.addinと.dllを入れたRevitのアドインディレクトリの中にプロジェクトファイル内のRevit.Async.dllを入れることで解決します。
エラーの原因を発見した経緯
エラーの原因を特定するために、レジストリキー [HKLM\Software\Microsoft\Fusion!EnableLog] の値を 1 に設定しました。この状態で再度エラーを吐かせると画像のように、Fusion ロードバランサーがどの場所を参照しているのか、そしてどのように依存関係を解決しようとしているのか詳細な情報を取得することができます。
結果として、Revit.Async.dllが正しい場所に存在していないことが判明し、そのファイルを手動でアドインフォルダに追加することでエラーが解消されました。
おわりに
本記事ではRevit.Asyncを使用する際、NuGetでインストールしただけではDLLが正しく認識されず、手動でアドインフォルダに配置する必要があることについて解説しました。今回の解決策が、同じ問題で悩んでいる方の助けになれば幸いです。
おまけ
作成したアドインを他のPCでビルドして使いたい場合は毎回手動でアドインフォルダにRevit.Async.dllを入れる必要があります。なのでビルドイベントでRevit.Async.dllの移動を自動化すると少し幸せになれます。
xcopy /y "$(TargetDir)Revit.Async.dll" "%APPDATA%\Autodesk\Revit\Addins\2022"