FIRST dllに次のコードがあります。
public Task FuncAsync(string a, string b, CancellationToken ct)
{
Task t = new Task
(
() =>
{
Save(a, b, ct);
}, ct
);
t.Start();
return t;
}
private void Save(string a, string b, CancellationToken ct)
{
classA.func(a, b, ct); // DOESNT WORK !
//classA.func(a, c); // WORKS !
}
メソッド クラスclassA
はSECOND dllにあります。
public void func(string a, string b, CancellationToken ct)
{
// some code...
}
public delegate void ProgressHandler(object sender, ProgressArgs progressArgs);
public event ProgressHandler ProgressChanged;
次に、メソッド FuncAsync がコンソール アプリケーションで呼び出されます。
CancellationTokenSource cancelSource = new CancellationTokenSource();
CancellationToken ct = cancelSource.Token;
Task task = B.SaveAsync("", "", ct);
最初の DLL には 2 番目の DLL が含まれ、コンソール アプリケーションには最初の DLL が含まれます。
このコードは正常にコンパイルされ、警告もエラーもありません。しかし、実行時に次の行でエラーが発生します: Save(a, b, ct);
Additional information: Could not load type 'ProgressHandler' from assembly 'A.B.C, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'func' has no implementation (no RVA).
コードから CancellationToken を削除すると、すべて問題ありません。
CancellationToken を Application から DLL1 に送信し、次に DLL1 から DLL2 に送信するにはどうすればよいですか?
編集 :
コマンドのみを使用して、2つのDLLを1つにマージすることを正確に忘れていました。
ILMerge /target:libray dll1Temp.dll dll2.dll /out:dll1.dll /internalize /allowDup /lib:C:\Windows\Microsoft.NET\Framework64\v4.0.30319
del dll1Temp.dll
del dll2.dll
ライブラリをマージしない場合、コードにエラーはありません。