3

VSPackageプロジェクトでGraph#ライブラリを使用しようとしていますが、残念ながら克服すべき障害がいくつかあります。これが私がしたことです:

次のすべての DLL をプロジェクト ルートのフォルダー /Libraries にコピーしました。

  • GraphSharp.dll
  • GraphSharp.Controls.dll
  • QuickGraph.dll
  • WPFExtensions.dll

すべてのビルド アクションは「コンテンツ」であり、出力へのコピー オプションは「コピーしない」に設定されています。

これらの参照をプロジェクトに追加しました。(参照を追加... -> 参照 -> /Library フォルダーから選択)

その後、以下のファイルを作成しました。ViewModel が UserControl の DataContext に設定され、UI がバインドされる "MethodGraph" が定義されていることがわかります。

XAML ファイル

<UserControl x:Class="Biocoder.InteractiveExploration.View.ExplorationControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <ListView Grid.Row="0" ItemsSource="{Binding SelectedMethods}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Method" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="ReturnType" DisplayMemberBinding="{Binding ReflectionInfo.ReturnType}"/>
                <GridViewColumn Header="Incoming Calls"/>
                <GridViewColumn Header="Outgoing Calls"/>
            </GridView>
        </ListView.View>
    </ListView>

    <graphsharp:GraphLayout Graph="{Binding MethodGraph}"/>

</Grid>

</UserControl>

分離コード

public partial class ExplorationControl : UserControl
{
    public ExplorationControl()
    {
        InitializeComponent();

        // set the datacontext
        DataContext = InteractiveExplorationPackage.ExplorationToolViewModel;
    }
}

ビューモデル

public class ExplorationToolViewModel : ViewModelBase
{
    private IBidirectionalGraph<object, IEdge<object>> _methodGraph;

    public IBidirectionalGraph<object, IEdge<object>> MethodGraph
    {
        get { return _methodGraph; }
        set
        {
            if (value != _methodGraph)
            {
                _methodGraph = value;
                NotifyPropertyChanged("MethodGraph");
            }
        }
    }

    public ExplorationToolViewModel()
    {
        InitializeViewModel();
    }

    private void InitializeViewModel()
    {
        SelectedMethods = new ObservableCollection<Method>();
        CreateGraph();
    }

    private void CreateGraph()
    {
        var g = new BidirectionalGraph<object, IEdge<object>>();

        // add vertices
        string[] vertices = new string[5];
        for (int i = 0; i < 5; i++)
        {
            vertices[i] = i.ToString();
            g.AddVertex(vertices[i]);
        }

        // add edges
        g.AddEdge(new Edge<object>(vertices[0], vertices[1]));
        g.AddEdge(new Edge<object>(vertices[1], vertices[2]));
        g.AddEdge(new Edge<object>(vertices[2], vertices[3]));
        g.AddEdge(new Edge<object>(vertices[3], vertices[1]));
        g.AddEdge(new Edge<object>(vertices[1], vertices[4]));

        MethodGraph = g;
    }
}

幸いなことに、プロジェクト全体をコンパイルできますが、実行時に XAML で次のエラーがタグ (必要なタグのすぐ上) で発生します。

ファイルまたはアセンブリ 'GraphSharp.Controls, PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムはファイルを見つけることができません。

しかし、私はアセンブリを参照しました。それらは参照リストにリストされています。どうしたの?Visual Studio パッケージ(プラグイン)を作成するときに、アセンブリを通常とは別の方法で参照する必要があるのでしょうか?

編集: 別のプロジェクトで動作させようとしたので、通常の WPF アプリケーションをセットアップし、上記のすべてを実行しました。このソリューションでは、すべてが正常に機能します。それはとても奇妙です!

あなたが私を助けてくれることを願っています:-)よろしくお願いします!

4

4 に答える 4

1

プロジェクトで nuget を使用できますか? その場合は、dll-s と参照を手動でコピーする代わりに、runinstall-package graphsharpコマンドを試してください。

なんらかのDLL strong name問題だと思います。

于 2012-10-17T22:02:13.553 に答える
0

これを試しましたか?http://shfb.codeplex.com/workitem/32819

それは言う:

私はそのような問題を抱えていました、そしてそれは議論のどこかで議論されています。あなたがする必要があるのは、プロジェクトのプロパティ>パスを開き、そこにすべてのパスを削除することです(それらを空のままにします)

于 2012-10-19T12:55:45.670 に答える
0

これですべてが機能するようになりました。とにかく助けてくれてありがとう!

実行時の VSPackages の問題は、基本的に、Private Assembly フォルダーと呼ばれるコンピューター上の別の場所からサード パーティのアセンブリを読み込むことです。(C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies) したがって、参照されているアセンブリをこのフォルダーにコピーするだけです (管理者権限が必要です)。開発時にアセンブリを使用できるようにするには、通常どおりにこれらの参照をプロジェクトに追加するだけで、コンパイラはそれらを通常の方法で使用します。Visual Studio はプライベート アセンブリ フォルダーからこれらの参照を読み込むため、唯一の違いは実行時です。

詳細については、こちらを参照してください: Managed VSPackage ファイルの場所のキー

于 2012-10-19T14:06:37.427 に答える