情報が分散しているので、ExcelDNAで非同期処理の関数を動かすのに時間がかかりました。
ExcelDNAの非同期関数のサンプルは、
AsyncFunctionExamples.cs
にあります。
プロジェクトに追加
-
nuget
で、ExcelDna.Registration
を追加して下さい。 -
<PropertyGroup>
に次を登録します。
<ExcelAddInExplicitRegistration>true</ExcelAddInExplicitRegistration>
コピーするファイル
次に列記したファイルを、プロジェクトにコピーします。
ただし、どこまで必要なコードか詳しく分析していないので、不要な部分も含むと思います。
-
ExampleAddIn.cs
このファイルのうち次の部分は、コメントアウトで良いです。
InstanceMemberRegistration.TestInstanceRegistration();
次の部分で、C#のメソッドをExcel関数として登録していくと思われます。
public void AutoOpen()
{
ExcelRegistration.GetExcelFunctions()
.ProcessMapArrayFunctions(conversionConfig)
.ProcessParameterConversions(conversionConfig)
.ProcessAsyncRegistrations(nativeAsyncIfAvailable: false)
.ProcessParameterConversions(postAsyncReturnConfig)
.ProcessParamsRegistrations()
.ProcessFunctionExecutionHandlers(functionHandlerConfig)
.RegisterFunctions();
-
TimingFunctionExecutionHandler.cs
ここまで、namespaceは適宜変更して下さい。 -
SuppressInDialogHandler.cs このファイルのnamespaceは、
ExcelDna.Registration
のままで良いです。
関数
次のように、Excelの関数にするメソッドに、[ExcelAsyncFunction]
をつけます。
[ExcelAsyncFunction]
public static async Task<string> dnaDelayedTaskHello(string name, int msDelay)
{
await Task.Delay(msDelay);
return "Hello " + name;
}
確認環境
.NET 6