0

プロパティ ウィンドウに新しいプロパティを追加する EF デザイナー用の小さな拡張機能を作成しました。vsix プロジェクト (新しいプロジェクト -> c# -> 拡張性 -> vsix プロジェクト) を使用してこれを行いました。F5 キーを押すと、実験的な VS インスタンスが起動します。新しいプロジェクトを作成し、エンティティ データ モデルを追加して、エンティティを追加します。しかし、私のブレークポイントはヒットせず、プロパティが表示されません。私が間違っているかもしれないことについてのアイデアはありますか?

public class AggregateRootValue
{
    internal static XName AggregateRootElementName = XName.Get("AggregateRoot", "http://efex");

    private readonly XElement _property;
    private readonly PropertyExtensionContext _context;

    public AggregateRootValue(XElement parent, PropertyExtensionContext context)
    {
        _property = parent;
        _context = context;
    }

    [DisplayName("Aggregate Root")]
    [Description("Determines if an entity is an Aggregate Root")]
    [Category("Extensions")]
    [DefaultValue(true)]
    public string AggregateRoot 
    {
        get 
        {
            XElement child = _property.Element(AggregateRootElementName);
            return (child == null) ? bool.TrueString : child.Value;
        }
        set 
        {
            using (EntityDesignerChangeScope scope = _context.CreateChangeScope("Set AggregateRoot"))
            {
                var element = _property.Element(AggregateRootElementName);
                if (element == null)
                    _property.Add(new XElement(AggregateRootElementName, value));
                else
                    element.SetValue(value);
                scope.Complete();
            }
        }
    }
}

[Export(typeof(IEntityDesignerExtendedProperty))]
[EntityDesignerExtendedProperty(EntityDesignerSelection.ConceptualModelEntityType)]
public class AggregateRootFactory : IEntityDesignerExtendedProperty
{
    public object CreateProperty(XElement element, PropertyExtensionContext context)
    {
        var edmXName = XName.Get("Key", "http://schemas.microsoft.com/ado/2008/09/edm");
        var keys = element.Parent.Element(edmXName).Elements().Select(e => e.Attribute("Name").Value);

        if (keys.Contains(element.Attribute("Name").Value))
            return new AggregateRootValue(element, context);

        return null;
    }
}

編集: コードを Github に置きました: https://github.com/devlife/Sandbox

編集: 提案されたように MEF コンポーネントをマニフェストに追加した後、拡張機能はまだ読み込まれません。マニフェストの写真は次のとおりです。

VSIX マニフェスト

4

3 に答える 3

2

結局のところ、答えはプロジェクトのセットアップ方法にあります。VSIX ファイルを生成するプロジェクト内に両方のクラスを配置します。これらのクラスを別のプロジェクトに移動し、そのプロジェクトをマニフェストで MEF コンポーネントとして設定する (したがって、アセンブリをコピーする) だけで、魅力的に機能しました!

于 2012-02-07T13:49:28.793 に答える
1

VS2012 の場合、ソリューションを MEF コンポーネントとして追加するだけで済みます。ソリューション全体を MEF コンポーネントとして追加するだけです。すると、驚くほどうまくいきます。

ここに画像の説明を入力

于 2012-11-26T07:55:12.227 に答える
0

プロジェクトによってビルドされた dll は、生成された VSIX パッケージに自動的に含まれていないようです。また、VS2013 では、IDE を介してこれを変更するオプションが提供されていません (とにかく解決できます)。

プロジェクト ファイルを手動で開き、XML を変更する必要があります。変更するプロパティは、IncludeAssemblyInVSIXContainer です。

こちらをご覧ください:パッケージに VSIX 出力を含める方法は?

于 2014-11-14T13:48:16.343 に答える