Microsoft MVP성태의 닷넷 이야기
VC++: 139. Visual C++ - .NET Core의 nethost.lib와 정적 링크 [링크 복사], [링크+제목 복사]
조회: 8792
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 3개 있습니다.)

Visual C++ - .NET Core의 nethost.lib와 정적 링크

.NET Core를 직접 호스팅하기 위한 교각 역할은 SDK 설치 시 확인할 수 있는 다음의 폴더에,

C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Host.win-x64\5.0.0\runtimes\win-x64\native

포함된 nethost가 담당합니다.

  • nethost.h
  • nethost.dll (동적 DLL)
  • nethost.lib (nethost.dll의 import library)
  • libnethost.lib (정적 DLL)

따라서 nethost.dll과 함께 배포한다면 이렇게 사용할 수 있고,

#include "C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Host.win-x64\5.0.0\runtimes\win-x64\native\nethost.h"
#pragma comment(lib, "C:\\Program Files\\dotnet\\packs\\Microsoft.NETCore.App.Host.win-x64\\5.0.0\\runtimes\\win-x64\\native\\nethost.lib")

그것 없이 한다면 정적 링크를 해야 하므로 이렇게 코딩하면 됩니다.

#define NETHOST_USE_AS_STATIC
#include "C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Host.win-x64\5.0.0\runtimes\win-x64\native\nethost.h"

#pragma comment(lib, "C:\\Program Files\\dotnet\\packs\\Microsoft.NETCore.App.Host.win-x64\\5.0.0\\runtimes\\win-x64\\native\\libnethost.lib")

일단, 동적 링크를 사용하면 여기까지 읽은 것으로 끝낼 수 있습니다. 하지만, 정적 링크를 사용하면 약간의 오류 상황을 헤쳐 나가야 합니다.




정적 링크로 main을 다음과 같이 구성한 다음,

int main()
{
    char_t buffer[MAX_PATH];
    size_t buffer_size = sizeof(buffer) / sizeof(char_t);

    int rc = get_hostfxr_path(buffer, &buffer_size, nullptr);
    std::wcout << buffer << std::endl;
}

/* 출력 결과
C:\Program Files\dotnet\host\fxr\5.0.0\hostfxr.dll
*/

빌드하면 이런 오류를 만나게 됩니다.

2>libnethost.lib(nethost.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in ConsoleApplication1.obj
2>libnethost.lib(nethost.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in ConsoleApplication1.obj

우선, _ITERATOR_DEBUG_LEVEL은 사용하려는 측에도 맞춰주면 되므로 "Configuration Properties" / "C/C++" / "Preprocessor"에 "_ITERATOR_DEBUG_LEVEL=0" 값을 추가합니다. 그럼, 이제 "error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug'" 항목이 남는데요, 아래의 글에도 정리했지만,

Visual C++ - error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug'
; https://www.sysnet.pe.kr/2/0/12418

프로젝트의 상숫값 정의에서 "_DEBUG" 항목을 제외해야 합니다.

그럼, 이제 다음과 같이 빌드가 성공합니다.

Rebuild started...
1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>ConsoleApplication1.cpp
1>libnethost.lib(nethost.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
1>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification
1>   Creating library E:\temp\use_nethost\ConsoleApplication1\x64\Debug\ConsoleApplication1.lib and object E:\temp\use_nethost\ConsoleApplication1\x64\Debug\ConsoleApplication1.exp
1>Generating code
1>Finished generating code
1>libnethost.lib(nethost.obj) : warning LNK4099: PDB '' was not found with 'libnethost.lib(nethost.obj)' or at ''; linking object as if no debug info
1>libnethost.lib(utils.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(utils.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>libnethost.lib(fxr_resolver.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(fxr_resolver.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>libnethost.lib(trace.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(trace.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>libnethost.lib(pal.windows.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(pal.windows.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>libnethost.lib(fx_ver.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(fx_ver.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>libnethost.lib(longfile.windows.obj) : warning LNK4099: PDB 'libnethost.pdb' was not found with 'libnethost.lib(longfile.windows.obj)' or at 'E:\temp\use_nethost\ConsoleApplication1\x64\Debug\libnethost.pdb'; linking object as if no debug info
1>ConsoleApplication1.vcxproj -> E:\temp\use_nethost\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe
1>Done building project "ConsoleApplication1.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




위에서 남은 경고를 없애고 싶다면, 우선 PDB 관련 오류를 다음의 글에 따라,

Visual C++ - warning LNK4099: PDB '...pdb' was not found with '...lib(pch.obj)' or at '...pdb'; linking object as if no debug info
; https://www.sysnet.pe.kr/2/0/12417

"/ignore:4099"로 없앨 수 있습니다. 그럼, "MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance" 메시지가 남는데 이것은 다음의 글에 따라 수정해 나가면 됩니다.

Visual C++ - MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
; https://www.sysnet.pe.kr/2/0/12420




만약 이런 오류가 발생한다면?

Error LNK2019 unresolved external symbol __imp_get_hostfxr_path referenced in function main

"__imp_"가 붙었으니, 아마도 nethost.h 파일을 include 하기 전 "NETHOST_USE_AS_STATIC" 상수를 빼먹었을 것입니다.

#define NETHOST_USE_AS_STATIC
#include "C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Host.win-x64\5.0.0\runtimes\win-x64\native\nethost.h"




참고로, 다음의 글은 nethost 사용을 시작으로 닷넷 코어 런타임을 직접 호스팅하는 방법에 대한 문서입니다.

Native hosting
; https://github.com/dotnet/runtime/blob/master/docs/design/features/native-hosting.md

Sample .NET Core Hosts
; https://github.com/dotnet/samples/tree/master/core/hosting

Write a custom .NET Core host to control the .NET runtime from your native code
; https://learn.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 3/9/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13399정성태8/9/20233392닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/20234157스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
13397정성태7/23/20233659닷넷: 2134. C# - 문자열 연결 시 string.Create를 이용한 GC 할당 최소화
13396정성태7/22/20233348스크립트: 54. 파이썬 pystack 소개 - 메모리 덤프로부터 콜 스택 열거
13395정성태7/20/20233311개발 환경 구성: 685. 로컬에서 개발 중인 ASP.NET Core/5+ 웹 사이트에 대해 localhost 이외의 호스트 이름으로 접근하는 방법
13394정성태7/16/20233259오류 유형: 873. Oracle.ManagedDataAccess.Client - 쿼리 수행 시 System.InvalidOperationException
13393정성태7/16/20233424닷넷: 2133. C# - Oracle 데이터베이스의 Sleep 쿼리 실행하는 방법
13392정성태7/16/20233299오류 유형: 872. Oracle - ORA-01031: insufficient privileges
13391정성태7/14/20233370닷넷: 2132. C# - sealed 클래스의 메서드를 callback 호출했을 때 인라인 처리가 될까요?
13390정성태7/12/20233341스크립트: 53. 파이썬 - localhost 호출 시의 hang 현상
13389정성태7/5/20233324개발 환경 구성: 684. IIS Express로 호스팅하는 웹을 WSL 환경에서 접근하는 방법
13388정성태7/3/20233517오류 유형: 871. 윈도우 탐색기에서 열리지 않는 zip 파일 - The Compressed (zipped) Folder '[...].zip' is invalid. [1]파일 다운로드1
13387정성태6/28/20233536오류 유형: 870. _mysql - Commands out of sync; you can't run this command now
13386정성태6/27/20233606Linux: 61. docker - 원격 제어를 위한 TCP 바인딩 추가
13385정성태6/27/20233826Linux: 60. Linux - 외부에서의 접속을 허용하기 위한 TCP 포트 여는 방법
13384정성태6/26/20233570.NET Framework: 2131. C# - Source Generator로 해결하는 enum 박싱 문제파일 다운로드1
13383정성태6/26/20233316개발 환경 구성: 683. GPU 런타임을 사용하는 Colab 노트북 설정
13382정성태6/25/20233358.NET Framework: 2130. C# - Win32 API를 이용한 윈도우 계정 정보 (예: 마지막 로그온 시간)파일 다운로드1
13381정성태6/25/20233746오류 유형: 869. Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
13380정성태6/24/20233196스크립트: 52. 파이썬 3.x에서의 동적 함수 추가
13379정성태6/23/20233210스크립트: 51. 파이썬 2.x에서의 동적 함수 추가
13378정성태6/22/20233098오류 유형: 868. docker - build 시 "CANCELED ..." 뜨는 문제
13377정성태6/22/20236902오류 유형: 867. 파이썬 mysqlclient 2.2.x 설치 시 "Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually" 오류
13376정성태6/21/20233287.NET Framework: 2129. C# - Polly를 이용한 클라이언트 측의 요청 재시도파일 다운로드1
13375정성태6/20/20232986스크립트: 50. Transformers (신경망 언어모델 라이브러리) 강좌 - 2장 코드 실행 결과
13374정성태6/20/20233111오류 유형: 866. 파이썬 - <class 'AttributeError'> module 'flask.json' has no attribute 'JSONEncoder'
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...