在VS扩展项目中使用Extended.Wpf.Toolkit时出现XamlParseException异常

3
我有一个现有的WPF应用程序,我想将其制作为Visual Studio扩展。
基本上,我有一个XAML窗口,在其中我使用了AvalonDock的Extended.Wpf.Toolkit库。这个应用程序完美地工作,没有任何问题。
我尝试在我的扩展项目中重用相同的窗口,但加载时出现了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在作为扩展运行时没有正确注册,我可能需要以特定方式引用它们...目前,它们在扩展的csproj中被引用+CopyLocal=True。
编辑2:
添加了源代码以重现问题https://github.com/MrLuje/VSPackage_NotWorking 有两个项目:
- 一个WPF应用程序,在MainWindow中有一个工作代码 - 一个VS扩展,在Window1中有一个不工作的代码(在调试中,您需要单击工具>"我的命令名称")

听起来像是LayoutPanel不受方向限制。你需要设置方向吗?如果不需要,就将其删除并继续进行。如果需要,[编辑]并添加详细信息。 - user1228
我不需要它们,但问题仍然存在,同一行。 - MrLuje
你需要捕获异常细节以便确定哪个方法没有被实现。 - user1228
我猜测类型本身(LayoutPanel)无法加载...编辑了初始帖子,似乎是一个引用问题。 - MrLuje
将程序集安装到全局程序集缓存(GAC)通常是可接受的解决方案。我猜你正在进行xcopy安装。NIE没有指示这一点。也许融合从您计算机上的其他位置加载了不同版本。这里有很多猜测。异常详细信息和融合日志可能会回答它们。您可以在下面添加一个答案来关闭此问题。 - user1228
2个回答

3
我找到一个更简单的解决方案,“ProvideBindingPath” 将你当前的扩展文件夹添加到dlls的解析文件夹中。
 [ProvideBindingPath]
 public sealed class MainWindowPackage : Package
 {
 }

基于VSIX - 无法加载引用的dll文件或程序集提出的解决方案。

将dll文件添加到全局程序集缓存(GAC)的解决方案“原封不动”地行不通......VSIX扩展不允许在GAC上注册,也许可以通过运行gacutil来实现解决。


1
没错,完美运行。 比 GAC 安装干净多了! - MrLuje
谢谢!这个方法可行。你是怎么想到的?ProvideBindingPath 真的没有任何文档资料。 - MgSam

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接