在VS扩展项目

时间:2015-05-03 14:28:46

标签: wpf xaml vsix vsx avalondock

我有一个现有的WPF应用程序,我想从中创建一个VisualStudio扩展。

基本上,我有一个xaml窗口,我在其中使用扩展名为.Wpf.Toolkit的库为AvalonDock。此应用程序完美运行,没有任何问题。

我尝试在扩展项目中重复使用相同的窗口,并在加载时得到XamlParseException

以下示例代码失败:

<Window x:Class="Company.VisualStudioExtension.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
    Title="Window2" Height="300" Width="300">
<Grid>
    <xcad:DockingManager AllowMixedOrientation="True" BorderThickness="1">
        <xcad:DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Test" />
                </StackPanel>
            </DataTemplate>
        </xcad:DockingManager.DocumentHeaderTemplate>
        <xcad:LayoutRoot x:Name="_layoutRoot">
            <xcad:LayoutPanel Orientation="Horizontal">
                <xcad:LayoutAnchorablePane DockWidth="300">
                </xcad:LayoutAnchorablePane>
            </xcad:LayoutPanel>
        </xcad:LayoutRoot>
    </xcad:DockingManager>
</Grid>

以下行突出显示异常:

            <xcad:LayoutPanel Orientation="Horizontal">

“方法或操作未实施。”

修改

似乎在GAC中注册所有AvalonDock dll修复了这个问题,但显然,这不是一个可接受的解决方案......

我猜这些dll在作为扩展程序运行时没有正确注册,我可能需要以特定方式引用它们...现在,它们在Extension的csproj + CopyLocal = True

中被引用

EDIT2

添加了源代码以重现问题https://github.com/MrLuje/VSPackage_NotWorking

有两个项目:

  • 在MainWindow中使用工作代码的WPF应用
  • 在Window1中使用非工作代码的VS扩展(在调试中,您需要单击工具&gt;“我的命令名称”)

2 个答案:

答案 0 :(得分:3)

我找到了一个更简单的解决方案,&#39; ProvideBindingPath&#39;这会将您当前的扩展文件夹添加到dll的解析文件夹中。

 [ProvideBindingPath]
 public sealed class MainWindowPackage : Package
 {
 }

基于以下问题的解决方案:VSIX - Cannot load file or assembly of a referenced dll

添加到gac的解决方案不会工作&#39; ... VSIX扩展不允许在gac上注册,也许解决方法将运行gacutil。

答案 1 :(得分:0)

跟随@Will的回答,并使用以下代码,该代码正常工作:

protected override void Initialize()
{
    base.Initialize();

    InstallAvalonToGac();
}

private static void InstallAvalonToGac()
{
    var dlls = new string[]
    {
        "Xceed.Wpf.AvalonDock.dll",
        "Xceed.Wpf.DataGrid.dll",
        "Xceed.Wpf.Toolkit.dll"
    };

    foreach (var dll in dlls)
    {
        var fullpath = Path.Combine(Environment.CurrentDirectory, dll);
        new System.EnterpriseServices.Internal.Publish().GacInstall(fullpath);
    }
}