c# - 从 System.Runtime.InteropServices.Marshal C# 中找不到 GetActiveObject 的定义

标签 c# excel interop

我正在尝试连接到正在运行的 Excel 实例,但是当我尝试使用以下代码片段时:

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

public Application StartExcel()
{
    Application instance = null;
    try
    {
        instance = (Application)Marshal.GetActiveObject("Excel.Application");
    }
    catch (COMException ex)
    {
        instance = new ApplicationClass();
    }

    return instance;
}

我在互联网上找到了类似的片段,但是当我编译这段代码时,我得到了以下错误:

error CS0117: 'Marshal' does not contain a definition for 'GetActiveObject'.



我不知道为什么,因为我有以下 NuGet 包:
- Microsoft.Office.Interop.Excel
- System.Runtime.InteropServices

最佳答案

我们需要从源代码 GitHub.Microsoft 中提取 GetActiveObject(String ProgID) 函数
创建自己的类,例如 - Marshal2
并像以前一样使用

Marshal2.GetActiveObject(progID);
源代码
public static class Marshal2
{
    internal const String OLEAUT32 = "oleaut32.dll";
    internal const String OLE32 = "ole32.dll";

    [System.Security.SecurityCritical]  // auto-generated_required
    public static Object GetActiveObject(String progID)
    {
        Object obj = null;
        Guid clsid;

        // Call CLSIDFromProgIDEx first then fall back on CLSIDFromProgID if
        // CLSIDFromProgIDEx doesn't exist.
        try
        {
            CLSIDFromProgIDEx(progID, out clsid);
        }
        //            catch
        catch (Exception)
        {
            CLSIDFromProgID(progID, out clsid);
        }

        GetActiveObject(ref clsid, IntPtr.Zero, out obj);
        return obj;
    }

    //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
    [DllImport(OLE32, PreserveSig = false)]
    [ResourceExposure(ResourceScope.None)]
    [SuppressUnmanagedCodeSecurity]
    [System.Security.SecurityCritical]  // auto-generated
    private static extern void CLSIDFromProgIDEx([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

    //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
    [DllImport(OLE32, PreserveSig = false)]
    [ResourceExposure(ResourceScope.None)]
    [SuppressUnmanagedCodeSecurity]
    [System.Security.SecurityCritical]  // auto-generated
    private static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

    //[DllImport(Microsoft.Win32.Win32Native.OLEAUT32, PreserveSig = false)]
    [DllImport(OLEAUT32, PreserveSig = false)]
    [ResourceExposure(ResourceScope.None)]
    [SuppressUnmanagedCodeSecurity]
    [System.Security.SecurityCritical]  // auto-generated
    private static extern void GetActiveObject(ref Guid rclsid, IntPtr reserved, [MarshalAs(UnmanagedType.Interface)] out Object ppunk);

}

关于c# - 从 System.Runtime.InteropServices.Marshal C# 中找不到 GetActiveObject 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58010510/

相关文章:

c# - 使用 HtmlAgilityPack 关闭父标签末尾的标签

c# - 查询字符串值始终为 0

c# - C# 中数据库驱动的 'scheduled tasks' 应用程序 - 需要一些重新 cron 语法的建议

Java :- How to save in Microsoft Excel 2010 when read through csv

c# - 将 vector/数组从非托管 C++ 传递到 C#

c# - 动态加载类并调用它们的最佳方法是什么

excel - 基于Excel工作表中的单元格颜色和文本颜色子集数据框

REPL : 'require versus ' import a Java class 中的 Java-Clojure 互操作

delegates - c++/cli 将(托管)委托(delegate)传递给非托管代码

Excel 货币 (FX) 每日汇率