我试图为VBIDE写一个简单的扩展,并坚持创建一个可停靠的窗口.我得到的错误是HRESULT 0x800401F3在线:

_window = windows.CreateToolWindow(
                        _addin,
                        "VBAaddin.TestComponent",
                        "My CoolDoc", 
                        guid, 
                        ref control
                    );

分机号:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Extensibility;
using Microsoft.Vbe.Interop;
using VB = Microsoft.Vbe.Interop;

namespace VBAaddin
{
    [
        ComVisible(true),
        ProgId("VBAaddin.Extension"),
        Guid("60A72993-8B93-4C71-81E8-87BC6DD85F5D"),
        ClassInterface(ClassInterfaceType.None),
        ComDefaultInterface(typeof(IDTExtensibility2)),
        EditorBrowsable(EditorBrowsableState.Never)
    ]
public class Extension : IDTExtensibility2
    {
        private VB.VBE _vbe;
        private VB.AddIn _addin;
        private VB.Window _window;
        public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
        {
            _vbe = (VB.VBE)Application;
            _addin = (VB.AddIn)AddInInst;

            switch (ConnectMode)
            {
                case ext_ConnectMode.ext_cm_Startup:
                    break;
                case ext_ConnectMode.ext_cm_AfterStartup:
                    InitializeExtension();
                    break;
            }
        }

        private void InitializeExtension()
        {
            MessageBox.Show("Initializing");
            try
            {
                try
                {
                    object control = null;
                    const string guid = "9A195073-D54B-4FFD-883C-EBBBEFD860F5";
                    Windows windows = _vbe.Windows;
                    _window = windows.CreateToolWindow(
                        _addin,
                        "VBAaddin.TestComponent",
                        "My CoolDoc", 
                        guid, 
                        ref control
                    );
                    _window.Visible = true;
                }
                catch (COMException exception)
                {
                    MessageBox.Show(exception.ToString());
                }
            }
            catch (Exception e)
            {
                MessageBox.Show($"{e.Message} {e.Source}");
            }

        }

        public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
        {
        }

        public void OnAddInsUpdate(ref Array custom)
        {
        }

        public void OnStartupComplete(ref Array custom)
        {
               InitializeExtension();
        }

        public void OnBeginShutdown(ref Array custom)
        {
        }
    }
}

好的,好的.

using System.Runtime.InteropServices;
using System.Windows.Controls;

namespace VBAaddin
{
    [
        ComVisible(true),
        ProgId("VBAaddin.TestComponent"),
        Guid("9A195073-D54B-4FFD-883C-EBBBEFD860F5")
    ]
    public partial class TestComponent : UserControl
    {
        public TestComponent()
        {
            InitializeComponent();
        }
    }
}

TestComponent.xaml:

<UserControl x:Class="VBAaddin.TestComponent"
             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:local="clr-namespace:VBAaddin"
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="300">
    <Grid>
        <TextBox HorizontalAlignment="Center" Margin="0,82,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</UserControl>

雷吉:不,不,不.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\VBAaddin.Extension]
"Description"="VBAaddin"
"FriendlyName"="VBAaddin"
"LoadBehavior"=dword:00000003

[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins64\VBAaddin.Extension]
"Description"="VBAaddin"
"FriendlyName"="VBAaddin"
"LoadBehavior"=dword:00000003

[HKEY_CLASSES_ROOT\CLSID\{60A72993-8B93-4C71-81E8-87BC6DD85F5D}]
@="VBAaddin.Extension"

[HKEY_CLASSES_ROOT\CLSID\{60A72993-8B93-4C71-81E8-87BC6DD85F5D}\ProgId]
@="VBAaddin.Extension"

[HKEY_CLASSES_ROOT\VBAaddin.Extension]
@="VBAaddin.Extension"

[HKEY_CLASSES_ROOT\VBAaddin.Extension\CLSID]
@="{60A72993-8B93-4C71-81E8-87BC6DD85F5D}"

[HKEY_CLASSES_ROOT\VBAaddin.TestComponent]
@="VBAaddin.TestComponent"

[HKEY_CLASSES_ROOT\CLSID\{9A195073-D54B-4FFD-883C-EBBBEFD860F5}]
@="VBAaddin.TestComponent"

[HKEY_CLASSES_ROOT\VBAaddin.TestComponent\CLSID]
@="{9A195073-D54B-4FFD-883C-EBBBEFD860F5}"

推荐答案

需要TestComponent才能成为WinForms用户控件;对于WPF UI,您需要该用户控件来容纳可以加载XAML用户控件的WPF互操作主机(停靠/填充包含的用户控件).

这就是RubberDuck 2.x是如何做到的☺️

请注意,本机窗口和WinForms用户控件之间的COM互操作有许多特殊之处,这可能会使您很难正确地拆除以干净地关闭您的插件(这也是RubberDuck 3.x正在远离它们的部分原因).

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

MongoDB将JS查询转换为C#的问题

==和Tuple对象的相等<>

C#EF Core 8.0表现与预期不符

NET8 MAUI并部署到真实设备上进行测试

单元测试:模拟返回空

NET8 Maui&;iOS:AppCenter崩溃错误

如何将端点(或с匹配请求并判断其路径)添加到BCL?

Selify只更改第一个下拉菜单,然后忽略REST-C#

如何管理Azure认证客户端响应和证书 fingerprint

RabbitMQ群集的MassTransit配置问题

VS 2022与VS 2019:如何/为什么创建额外的任务?

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

Content WithTargetPath实际上是有效的MSBuild项吗?

用于获取字符串的最后12个字符的正则表达式(空格除外)

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

C#;AvaloniaUI;MVVM;当另一个窗口上的按钮被单击时,如何更新视图图像源?

在Visual Studio 2022中查找Xamarin模板时遇到问题

缩写的MonthNames有问题