시스템에서 GetActiveObject에 대한 정의를 찾을 수 없습니다.런타임.Interop Services.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;
}
인터넷에서 유사한 스니펫을 찾았지만 이 코드를 컴파일하면 다음 오류가 발생합니다.
오류 CS0117: 'Marshal'에 'GetActiveObject'에 대한 정의가 없습니다.
저는 다음과 같은 NuGet 패키지를 가지고 있기 때문에 이유를 모르겠습니다. - Microsoft.사무실. 인터럽트.Excel - 시스템.런타임.인터럽트 서비스
GetActiveObject(StringProg)를 풀해야 합니다.소스 코드 GitHub의 ID) 함수입니다.마이크로소프트
자신만의 클래스를 만듭니다(예: 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);
}
이것은 오직 사용 가능합니다.NetFramework이지만 에 해당되지 않습니다.NetCore. 를 확인하십시오.Net 프로젝트 유형.
실제로 BindToMoniker는 Interop Application Object를 얻기 위한 문제를 해결합니다.4.8에서 사용할 수 있습니다.NetFramework 및 6.0/.Net Core.이 api를 사용하는 것이 제가 수렴한 것입니다.
제가 알기로는 몇 가지 문제가 있습니다.
- Marshel에 대한 앱 식별
- 상호 운용을 위한 마샬 오브제 획득
GetActiveObject는 작동하는 동안 다른 사람의 질문/응답에서 활성 개체만 제공하며(해당 앱에 대해 실행 중인 프로세스가 여러 개일 때 문제가 됨) 4.8에서만 작동합니다.넷 프레임워크.
GetActiveObject를 사용할 때 다음 작업을 수행했습니다.
acApp = new Application();
acApp = (Application)Marshal.GetActiveObject("Access.Application");
이것은 잘 작동했지만, Interop App으로 전송할 데이터가 6.0에 구축된 코어 App으로 2개의 프로세스 모델을 구축해야 했습니다.원하는 애플리케이션 제어 기능을 제공하는 4.8로 구축된 한 프로세스와 6.0 구축된 다른 프로세스에 대한 RPC 도관을 제공합니다.6.0 RPC로 구축된 다른 프로세스는 애플리케이션 제어에 사용할 데이터를 생성했습니다.작업 세트 크기가 증가하고 RPC 전송 지연이 발생하더라도 이 작업은 정상적으로 작동했으며, 두 개 이상의 애플리케이션이 실행 중인 경우에도 문제가 해결되지 않았습니다.
제가 발견한 또 다른 기술은 다음과 같습니다.
acApp = new Application();
acApp = (Application)Marshal.BindToMoniker(_conf.Moniker);
여기서 "_conf.모니커"는 현재 실행 중인 응용 프로그램에서 사용하는 파일을 식별하는 프로세스로 전송된 문자열입니다.BindToMoniker는 4.8을 완전히 사용할 필요가 없었습니다.Net6.0 앱을 시작한 앱에서 명령줄로 이 문자열을 보냈습니다.애플리케이션 내에서 사용된 파일 이름을 전달하는 데 사용된 VBA는 다음과 같습니다.
AppToRun = "the60Netapp" & " -f " & """" & CurrentProject.FullName
ProcessID = Shell(AppToRun, 0)
프로세스를 저장했습니다.나중에 프로세스를 종료할 수 있는 ID입니다.BindToMoniker는 식별 문제와 유지 방법을 모두 해결하는 데 도움이 되었습니다.전체적으로 6.0(또는 원하는 모든 프레임워크)
제가 이 문제를 해결한 방법은 두 가지 프로세스 솔루션을 만드는 것이었습니다.하나는 을 사용합니다.넷 6, 다른 하나.Net Framework 4.8.저는 다른 마샬 오브제 루틴을 사용하려고 노력했지만, 미래의 사람들은 모든 종류의 개발 문제를 가질 것이라고 결정했습니다.
4.8 Framework를 사용하는 앱은 GetActiveObject를 호출하고 Office Apps VBA 기능과 함께 작동합니다.를 사용하는 앱입니다.오피스 앱에 대한 호출을 처리하기 위해 4.8 앱에 6개의 RPC를 연결합니다.
개인적으로 Invoke 솔루션이 OS dll과 너무 밀접하게 연결되어 있는 것 같아 걱정했습니다.두 개의 프레임워크 솔루션이 있는 두 개의 앱의 단점은 전체 솔루션에 대한 작업 세트가 Invoke 솔루션보다 크다는 것입니다.
언급URL : https://stackoverflow.com/questions/58010510/no-definition-found-for-getactiveobject-from-system-runtime-interopservices-mars
'programing' 카테고리의 다른 글
| 스토리지에 대한 일부 매개 변수를 확인할 수 없음: (?) (0) | 2023.06.27 |
|---|---|
| MVC 4 또는 5를 사용하는 MEF - Pluggable Architecture(2014) (0) | 2023.06.27 |
| Aggregate의 투영에서 $elemMatch를 사용하는 방법은 무엇입니까? (0) | 2023.06.22 |
| ASP.NET MVC에서 부분 보기용 컨트롤러 생성 (0) | 2023.06.22 |
| SQL - 소수 뒤의 숫자만 가져오려면 어떻게 해야 합니까? (0) | 2023.06.22 |