0

Windows ワークフローを使用してステート マシンを構築しており、ソリューション内の別のアセンブリからオブジェクトを新たに作成しようとしています。ソリューションをビルドすると、StateActivityValidator から TypeLoadException が返されます (これは、ビルドが成功した後に実行され、必要なすべてのプロパティが設定されていることなどを確認します)。

インスタンスを作成しようとしている型は非常に単純で、既定のパブリック コンストラクターがあり、両方のアセンブリが署名されています。問題の可能性はありますか?

4

2 に答える 2

0

私の推測では、WF が逆シリアル化を試みる前に、この他のアセンブリが読み込まれていません。これをテストするには、アプリケーションの実行を開始する前に (つまり、winforms アプリの Program クラスの Main メソッドで)、この型のインスタンスを新規作成するだけです。

このような場合は、いくつかのことを試すことができます。

最初に、逆シリアル化の前にメモリに必要なすべてのアセンブリを強制的に読み込みます (上記のテストのように)。この方法は、私見ですが、最悪です。

次に実行時の型解決にロジックを追加できます。 可能のようですが、やったことはありません。

3 番目に、シリアライズされたワークフローを変更して、タイプをロードするために必要な情報を提供します。

ワークフローをどのようにシリアライズしているかわからないため、これを行う方法を正確に説明することはできません。ワークフローは xaml にシリアル化されていると言えます。XamlReader は、逆シリアル化時に、xaml に含まれる型のアセンブリを読み込むことができます。これは、特殊なタイプの XML 名前空間を使用して行われます。

これが欠落しているタイプであるとしましょう (シリアル化されたワークフローで):

<MyType><!--blahblah--></MyType>

MyType は、アセンブリ MyCode.DLL で定義されています。

namespace MyCodeNamespace
{
  public class MyType { /*yadda*/ }
}

このタイプの名前空間は次の clr-namespace:MyCodeNamespace;assembly=MyCode ようになり、シリアル化されたワークフローでは次のように表示されます。

<MyType namespace="clr-namespace:MyCodeNamespace;assembly=MyCode"><!--blahblah--></MyType>

XamlReader はその名前空間を認識し、アセンブリが MyCode.DLL または MyCode.EXE と呼ばれていることを判別し、それを探してメモリに読み込み、MyCodeNamespace.MyType を探します。

問題は、「ワークフローでその名前空間をシリアル化するにはどうすればよいですか?」ということになります。答えは「わからない」です。おそらく、次のアセンブリ属性を使用できます。

[assembly: XmlnsPrefix("clr-namespace:MyCodeNamespace;assembly=MyCode", "MyCode")]
[assembly: XmlnsDefinition("clr-namespace:MyCodeNamespace;assembly=MyCode", "MyCodeNamespace")]

しかし、ワークフローシリアライザーがこれらを尊重するかどうかはわかりません。そもそも、Workflow シリアライザーが clr-namespace を尊重するかどうかさえわかりません。あなたはそれを試すことができます.そうでない場合は、これに基づいてSOについて別の質問をしてください.

于 2009-02-20T18:58:43.907 に答える