System.Runtime.InteropServices.Marshal C# 中未找到 GetActiveObject 的定义
No definition found for GetActiveObject from System.Runtime.InteropServices.Marshal C#
我正在尝试连接到 运行 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
这仅适用于 .Net Framework,不适用于 .Net Core。请检查 .Net 项目类型。
我们需要从源代码中提取 GetActiveObject(String ProgID) 函数 GitHub.Microsoft
创建您自己的 class,例如 - 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);
}
我正在尝试连接到 运行 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
这仅适用于 .Net Framework,不适用于 .Net Core。请检查 .Net 项目类型。
我们需要从源代码中提取 GetActiveObject(String ProgID) 函数 GitHub.Microsoft
创建您自己的 class,例如 - 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);
}