3

最初の編集を参照してください (下部のスクリーンショット):

この記事に従って、Winform アプリが VSTO アドイン メソッドをトリガーするようにしました 。 -requestcomaddinautomationservice.aspx

上記の記事の最後で、著者は問題について言及し、ここでそれを改善しようとしています。 -標準のolemarshalobject.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) [プロジェクト プロパティ] > [ビルド] > [COM 相互運用機能の登録] を選択します。アドインをコンパイルします。

d) 新しい Winform アプリ。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();
}
}

e) Winform アプリを実行すると、utils = (IAddinUtilities)addin.Object;AddinUtilities が StandardOleMarshalObject から派生しているかどうかに関係なく、行が失敗します。

MSDN ブログが具体的に述べているように、私はここで途方に暮れています。

1st EDIT:別のPC-Bでコードを試してみましたが、から派生せずに動作します StandardOleMarshalObject

ここに画像の説明を入力

PC-Bで試してみたStandardOleMarshalObjectところ、PC-A と同じ問題が発生しました。PC-A はどちらの方法でも機能せず、私が考えられる唯一の違いは管理者権限です。

ここに画像の説明を入力

管理者権限と Win7 以前 (古い msdn の記事) が、それが機能しない理由として考えられる唯一の理由です。

4

0 に答える 0