2

カスタムデザイナを使用してカスタムコードアクティビティを作成しました。これは、次の規則を使用してアクティビティに適用しました。

[Designer("MyDesignerType, Assembly, Version=1.0.0.0, PublicKeyToken=XXX")]

これはデザイン時に機能し、デザイナーが読み込まれ(GACに配置した場合)、デザインサーフェスにアクティビティを表示するために使用されます。

ワークフローを公開するとき、デザイナーDLLは本番サーバー上にありません(これはまさに私が意図したものです-したがって、ハードリンクを作成するのではなく、DesignerAttributeコンストラクターの「strong-name」バージョンを介してデザイナーを参照した理由ですデザイナーDLL)。

ただし、ランタイムが本番サーバーにワークフローをロードすると(TypeNotFound例外がスローされます)、MyDesignerType/DLLをロードしようとします。どうして??なぜワークフローランタイムは実行時にデザインタイム機能をロードしようとしているのですか?DesignerAttributeに緩く結合されたコンストラクターが付属している理由は、製品にデザイナーDLLをデプロイしないようにするためです...

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

4

緩く結合されたアクティビティデザイナが必要な場合は、をまったく適用しませんDesignerAttribute

したがって、基本的に、シナリオをサポートするために、次のような2つのdllがあります。

  • MyProject.Activities.dll
  • MyProject.Activities。Design.dll

ここで重要なのはDesign.dllです。そのdll内には、IRegisterMetadataを実装するクラスが必要であり、そこで魔法が起こります。

IRegisterMetadataタイプは、設計時属性と実行時タイプの関連付けを緩く結合した方法でカプセル化する方法を提供します。Windows Workflow Designerをホストしているアプリケーションは、IRegisterMetadataインターフェイスを使用して、アクティビティの属性を登録できます。たとえば、Visual Studio 2010は、*。designアセンブリ内の型も検索するだけでなく、これらの型を含むアセンブリが読み込まれるときに、IRegisterMetadataを実装する型を検索します。

IRegisterMetadataを介してデザイナーをアクティビティに登録する方法:

class Metadata : IRegisterMetadata
{
    public void Register()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        // Register Designers.
        builder.AddCustomAttributes(typeof(MyActivity), new DesignerAttribute(typeof(MyActivityDesigner)));
        // Apply the metadata
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}

Visual Studioワークフローデザイナーは、.Design.dllで終わるdllを探し、それを見つけると、IRegisterMetadata.Register()デザイナーをアクティビティにアタッチしている場所で実行されます。

于 2013-03-15T10:54:26.190 に答える