COM에 .NET Core 구성 요소 공개
이 문서에서는 .NET Core(또는 .NET 5 이상)에서 COM에 클래스를 노출하는 방법을 안내합니다. 이 자습서에서는 다음을 수행하는 방법을 보여 줍니다.
- .NET Core에서 COM에 클래스를 공개합니다.
- .NET Core 라이브러리를 빌드하는 동안 COM 서버를 생성합니다.
- 레지스트리 없는 COM을 위한 병렬 서버 매니페스트를 자동으로 생성합니다.
필수 조건
- .NET Core 3.0 SDK 또는 최신 버전을 설치합니다.
라이브러리 만들기
첫 번째 단계는 라이브러리를 만드는 것입니다.
새 폴더를 만든 다음, 해당 폴더에서 다음 명령을 실행합니다.
dotnet new classlib
Class1.cs
을(를) 여십시오.using System.Runtime.InteropServices;
를 파일의 맨 위에 추가합니다.IServer
인터페이스를 만듭니다. 예시:using System; using System.Runtime.InteropServices; [ComVisible(true)] [Guid(ContractGuids.ServerInterface)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IServer { /// <summary> /// Compute the value of the constant Pi. /// </summary> double ComputePi(); }
구현 중인 COM 인터페이스의 인터페이스 GUID를 사용하여
[Guid("<IID>")]
특성을 인터페이스에 추가합니다. 예:[Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]
. 이 GUID는 이 COM용 인터페이스의 유일한 식별자이므로 고유해야 합니다. Visual Studio에서 도구 > GUID 만들기로 이동하여 GUID 만들기 도구를 열어 GUID를 생성할 수 있습니다.[InterfaceType]
특성을 인터페이스에 추가하고 이 인터페이스에서 구현해야 하는 기본 COM 인터페이스를 지정합니다.IServer
를 구현하는Server
라는 클래스를 만듭니다.구현 중인 COM 클래스의 클래스 식별자 GUID를 사용하여
[Guid("<CLSID>")]
특성을 클래스에 추가합니다. 예:[Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]
. 인터페이스 GUID와 마찬가지로 이 GUID는 이 COM용 인터페이스의 유일한 식별자이므로 고유해야 합니다.인터페이스 및 클래스에 모두
[ComVisible(true)]
특성을 추가합니다.
Important
.NET Framework와 달리 .NET Core에서는 COM을 통해 활성화하려는 클래스의 CLSID를 지정해야 합니다.
COM 호스트 생성
.csproj
프로젝트 파일을 열고<PropertyGroup></PropertyGroup>
태그 안에<EnableComHosting>true</EnableComHosting>
을 추가합니다.- 프로젝트를 빌드합니다.
결과 출력에는 ProjectName.dll
, ProjectName.deps.json
, ProjectName.runtimeconfig.json
및 ProjectName.comhost.dll
파일이 포함됩니다.
COM용 COM 호스트 등록
관리자 권한 명령 프롬프트를 열고 regsvr32 ProjectName.comhost.dll
을 실행합니다. 이렇게 하면 공개된 모든 .NET 개체가 COM에 등록됩니다.
TLB(형식 라이브러리)를 포함하려는 경우 ComRegisterFunctionAttribute
및 ComUnregisterFunctionAttribute
를 사용하여 함수도 정의하는 것이 좋습니다. 이러한 함수를 사용하여 COM 서버에 대한 TLB를 등록 및 등록 취소할 수 있습니다. 자세한 예는 OutOfProcCOM
샘플을 참조하세요.
RegFree COM 사용
.csproj
프로젝트 파일을 열고<PropertyGroup></PropertyGroup>
태그 안에<EnableRegFreeCom>true</EnableRegFreeCom>
을 추가합니다.- 프로젝트를 빌드합니다.
이제 결과 출력에는 ProjectName.X.manifest
파일도 포함됩니다. 이 파일은 레지스트리 없는 COM과 함께 사용할 병렬 매니페스트입니다.
COM 호스트에 형식 라이브러리 포함
.NET Framework와 달리 .NET Core 또는 .NET 5 이상에서는 .NET 어셈블리에서 COM TLB(형식 라이브러리) 생성을 지원하지 않습니다. 이 지침에서는 COM 인터페이스의 기본 선언을 위한 IDL 파일 또는 C/C++ 헤더를 수동으로 작성해야 합니다. IDL 파일을 작성하려면 Visual C++ SDK의 MIDL 컴파일러로 컴파일하여 TLB를 생성할 수 있습니다.
.NET 6 이상 버전에서 .NET SDK는 이미 컴파일된 TLB를 프로젝트 빌드의 일부로 COM 호스트에 포함하는 기능을 지원합니다.
형식 라이브러리를 애플리케이션에 포함하려면 다음 단계를 수행하세요.
.csproj
프로젝트 파일을 열고<ItemGroup></ItemGroup>
태그 안에<ComHostTypeLibrary Include="path/to/typelib.tlb" Id="<id>" />
를 추가합니다.<id>
를 양의 정수 값으로 바꿉니다. 이 값은 COM 호스트에 포함되도록 지정하는 TLB에서 고유해야 합니다.Id
특성은 프로젝트에ComHostTypeLibrary
를 하나만 추가하는 경우 선택 사항입니다.
예를 들어 다음 코드 블록은 인덱스 1
의 Server.tlb
형식 라이브러리를 COM 호스트에 추가합니다.
<ItemGroup>
<ComHostTypeLibrary Include="Server.tlb" Id="1" />
</ItemGroup>
기본 AssemblyLoadContext
로드
활성화하는 동안 COM 구성 요소가 포함된 어셈블리는 어셈블리 경로를 기반으로 별도의 AssemblyLoadContext에 로드됩니다. 여러 COM 서버를 제공하는 하나의 어셈블리가 있는 경우 해당 어셈블리의 모든 서버가 동일한 로드 컨텍스트에 상주하도록 AssemblyLoadContext
가 다시 사용됩니다. COM 서버를 제공하는 여러 개의 어셈블리가 있는 경우 각 어셈블리에 대해 새 AssemblyLoadContext
가 만들어지고, 각 서버는 어셈블리에 해당하는 로드 컨텍스트에 상주합니다.
.NET 8 이상 버전에서 어셈블리는 기본 AssemblyLoadContext
에서 로드되도록 지정할 수 있습니다. 기본 컨텍스트에서 로드를 사용하도록 설정하려면 다음 RuntimeHostConfigurationOption 항목을 프로젝트에 추가합니다.
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Runtime.InteropServices.COM.LoadComponentInDefaultContext" Value="true" />
</ItemGroup>
예제
GitHub의 dotnet/samples 리포지토리에는 완벽하게 작동하는 COM 서버 샘플이 있습니다.
추가 참고 사항
Important
.NET Framework에서 “모든 CPU” 어셈블리는 32비트 및 64비트 클라이언트 모두에서 사용될 수 있습니다. 기본적으로 .NET Core, .NET 5 이상 버전에서는 "모든 CPU" 어셈블리에 64비트 *.comhost.dll함께 제공됩니다. 따라서 64비트 클라이언트에서만 사용될 수 있습니다. 또한 SDK에서 나타내기 때문에 기본값이 됩니다. 이 동작은 “자체 포함” 기능을 게시하는 방법과 동일하며 기본적으로 SDK에서 제공하는 기능을 사용합니다. NETCoreSdkRuntimeIdentifier
MSBuild 속성은 *.comhost.dll 비트 수를 결정합니다. 관리형 파트는 예상대로 비트 수와 관련이 없지만 함께 제공되는 네이티브 자산은 기본적으로 대상 SDK로 설정됩니다.
COM 구성 요소의 자체 포함 배포는 지원되지 않습니다. COM 구성 요소의 프레임워크 종속 배포만 지원됩니다.
EnableComHosting 속성을 통해 C++/CLI 프로젝트에서 COM 구성 요소를 노출하는 것은 지원되지 않습니다.
또한 .NET Framework와 .NET Core를 같은 프로세스에 로드하는 경우 진단 제한 사항이 있습니다. .NET Framework와 .NET Core를 동시에 디버그할 수 없으므로 기본 제한 사항은 관리형 구성 요소를 디버그하는 것입니다. 또한 두 런타임 인스턴스는 관리형 어셈블리를 공유하지 않습니다. 즉, 두 런타임 간에 실제 .NET 형식을 공유할 수 없으며 대신 모든 상호 작용을 노출된 COM 인터페이스 계약으로 제한해야 합니다.
.NET