使用Graph#libraries时出现XamlParseException

时间:2012-10-17 09:46:29

标签: xaml vspackage visual-studio-sdk xamlparseexception graph-sharp

我正在尝试使用 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”或其依赖项之一。系统找不到该文件。

但是我引用了程序集,它们列在引用列表中。 有什么问题?在编写 Visual Studio包(插件)时,是否必须以相反的方式引用程序集?

编辑:我只是试图让它在另一个项目中运行,所以我只是设置了一个普通的WPF应用程序并完成了上述所有操作。在这个解决方案中一切正常!那太奇怪了!

希望你能帮助我:-) 最好的问候!

4 个答案:

答案 0 :(得分:1)

您是否可以在项目中使用nuget?如果是这样,而是手动复制dll-s和引用,则应尝试运行install-package graphsharp命令。

我认为这是某种DLL strong name问题。

答案 1 :(得分:0)

你试过这个吗? http://shfb.codeplex.com/workitem/32819

它说:

  

我遇到了这样的问题,并在讨论的某个地方进行了讨论。您需要做的是打开项目属性&gt;路径并删除所有路径(只留空)

答案 2 :(得分:0)

我设法让一切正常运转。无论如何,谢谢你的帮助!

VSPackages在运行时的问题基本上是他们从名为私有程序集文件夹的计算机上的另一个位置加载第三方程序集。 (C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ PrivateAssemblies)因此,您所要做的就是将引用的程序集复制到此文件夹中(需要管理员权限)。为了能够在开发时使用程序集,只需按正常方式将这些引用添加到项目中,编译器将以通常的方式使用它们。唯一的区别是在运行时,因为Visual Studio从Private Assemblies文件夹加载这些引用。

有关此内容的更多信息,请访问:Managed VSPackage File Location Keys

答案 3 :(得分:0)

其他解决方案:

  1. 将库作为程序集资源添加到.vsixmanifest文件中:
  2. 将此代码添加到您的程序包初始化代码中。
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
    AppDomain.CurrentDomain.AssemblyResolve += LoadFromSameFolder;

    static Assembly? LoadFromSameFolder(object sender, ResolveEventArgs args)
    {
        var executingAssemblyPath = Assembly.GetExecutingAssembly().Location;
        var folderPath = Path.GetDirectoryName(executingAssemblyPath) ?? string.Empty;
        var assemblyPath = Path.Combine(folderPath, $"{new AssemblyName(args.Name).Name}.dll");

        return File.Exists(assemblyPath)
            ? Assembly.LoadFrom(assemblyPath)
            : null;
    }

    // your code
}