3

请参阅第一次编辑(底部的屏幕截图):

我已经按照这篇文章让 Winform 应用程序触发了 VSTO 加载项方法:http: //blogs.msdn.com/b/andreww/archive/2007/01/15/vsto-add-ins-comaddins-and -requestcomaddinautomationservice.aspx

在上述文章的末尾,作者提到了一个问题并试图在此处进行改进:http: //blogs.msdn.com/b/andreww/archive/2008/08/11/why-your-comaddin-object-should -派生自-standardolemarshalobject.aspx

我现在已经多次通过代码,并且派生 StandardOleMarshalObject 以改善异常的方法不起作用

System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type ... This operation failed because the QueryInterface call on the COM component for the interface with IID

这是一个重现 - 两个项目都针对 .Net 3.5:

a) 创建一个新的 Office > 2007 或 2010 > Excel 加载项:

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private AddinUtilities addinUtilities;
        protected override object RequestComAddInAutomationService()
        {
            if (addinUtilities == null)
            {
                addinUtilities = new AddinUtilities();
            }
            return addinUtilities;
        }
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
}
}

b) 向 Excel 加载项添加一个类:

namespace ExcelAddIn1
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAddinUtilities
{
    void DisplayMessage();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddinUtilities :
    StandardOleMarshalObject,
    IAddinUtilities
{
    void IAddinUtilities.DisplayMessage()
    {
        MessageBox.Show("Hello World");
    }
}
}

c) 设置 Project Properties > Build > seklect Register For COM Interop。编译加载项。

d) 新建 Winform App,引用 ExcelAddIn1、Microsoft.Office.Interop.Excel 和 Office,并将此代码包含在 Form1 中:

public partial class Form1 : Form
{
private Microsoft.Office.Interop.Excel.Application excel;
private IAddinUtilities utils;
public Form1()
{
    InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
    excel = new Microsoft.Office.Interop.Excel.Application();
    excel.Visible = true;
    excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlSheetType.xlWorksheet);
    object addinName = "ExcelAddin1";
    COMAddIn addin = excel.COMAddIns.Item(ref addinName);
    utils = (IAddinUtilities)addin.Object;
    utils.DisplayMessage();
}
}

utils = (IAddinUtilities)addin.Object;e) 运行 Winform 应用程序,无论 AddinUtilities 是否派生自 StandardOleMarshalObject ,该行都会失败。

正如 MSDN 博客特别指出的那样,我在这里不知所措:“要解决所有这些问题,您可以简单地从 StandardOleMarshalObject 派生 AddinUtilities 类,然后重建:”

第一次编辑:我在另一台 PC-B 上尝试了代码,它可以在没有派生的情况下工作 StandardOleMarshalObject

在此处输入图像描述

当我在 PC-B 上尝试时StandardOleMarshalObject,我遇到了与 PC-A 相同的问题。PC-A 不适用于任何一种方式,我能想到的唯一区别是管理员权限。

在此处输入图像描述

管理员权限和 Win7 之前的版本(旧的 msdn 文章)是我能想到它为什么不起作用的唯一原因。

4

0 回答 0