C#/WinUI3

WinUI3에서 C++ 사용하기 (WinRT 아님)

말하는 닭 2023. 7. 20. 12:27

사실 이 내용은 WinUI3에 국한된 것은 아니지만, 여기서 실행시켜볼 거니까 카테고리를 여기로 작성했다.


우선, Visual Studio Installer에 들어가서 "C++를 사용한 데스크탑 개발" > "v143 빌드 도구에 대한 C++/CLI 지원(최신)"을 선택하고 다운받는다. 

 

그 다음, WinUI3 프로젝트를 하나 만들었다. 꼭 WinUI3가 아니어도 된다. 다만 나는 이걸로 돌려볼거라 WinUI3를 사용했다.

또, 솔루션에 새 프로젝트를 추가한다. 아래 사진과 같이 c++로 맞춰놓고 "clr"을 검색하면 여러 개가 나온다.  

그 중 나는 CLR 클래스 라이브러리(.NET)을 골랐다. WinUI3의 대상 프레임워크가 .NET 6.0이기 때문이다. 무슨 프로젝트를 열건 대상 프레임워크를 잘 확인하여 골라주면 된다. 

 

그리고 WinUI3나 CLR 프로젝트를 추가할 때나 대상 프레임워크를 선택하지 못한다. 따라서 둘의 타겟이 다르면 서로 연동이 안 된다. 속성 탭을 들어가 둘의 대상 프레임워크를 맞춰주자. 

 

왜인지는 모르겠으나, WinUI3의 대상 프레임워크를 바꾸면 실행이 안 된다... 안 되는 건지 내가 이때의 실행방법을 모르는건지, F5를 누르면 돌아가야 하는데, 이걸 바꿨다가 실행이 안 되는 상황을...

CLR 라이브러리를 바꾸는 게 낫다. 괜히 WinUI3의 대상 프레임워크를 바꾸지 말자.

 

CLR: 기본으로 .NET 7.0으로 설정되어 있었다.
WinUI3 프로젝트의 대상 프레임워크. 건들면 실행이 안 된다. 왠지 모른다.

 

c++ 프로젝트의 헤더파일(아마 본인이 설정한 프로젝트 이름일 것이다)에 다음과 같이 작성해봤다. 클래스까지는 템플릿이다. public: ~~ 만 작성했다.

namespace ClassLibrary1 {
	public ref class Class1
	{
	public:
		int add(int a, int b);
	};
}

ClassLibrary1.cpp다. include는 자동으로 되어있고, add만 만들었다. 

#include "pch.h"

#include "ClassLibrary1.h"

int ClassLibrary1::Class1::add(int a, int b) {
	return a + b;
}

 

다 작성했다면 저장하고 빌드하면 된다. 이때, 속성에 들어가서 플랫폼을 Win32로 맞추고 빌드해야 한다. 항상 말하는 거 같긴 한데, 나도 모르겠다. 그냥 "안 돌아가는데 이렇게 하면 되더라"다. 맞췄다면 빌드하면 된다. 

플랫폼을 Win32로 맞춰주자.

빌드가 되었다면, 프로젝트 참조 추가를 해주면 된다. App1은 WinUI3 프로젝트다.

아마 있을 것인데, 체크하고 확인 누르면 된다. 

없다면, App1(솔루션 이름)\ClassLibrary1(CLR 프로젝트 이름)\ClassLibrary1.vcxproj로 된 파일을 찾아서 선택하면 된다.

다른 블로그는 dll 파일을 찾아보라는데 이 경우는 다른건지 모르겠다. 난 이걸로 해야하던데.

 

using namespace ClassLibrary1;

// class랑 이런거 저런거 다 생략
private void myButton_Click(object sender, RoutedEventArgs e) {
    Class1 Class1 = new Class1();
    openButton.Content = Class1.add(1, 3).ToString();
}

MainWindow.xaml.cs에 네임스페이스 추가하고, 기본으로 있던 버튼에 저렇게 코드를 작성해봤다. 

실행시키고 클릭하면 4로 잘 바뀐다.

실행은 되었는데, 버튼을 누를 때 에러가 난다면 실행을 x64로 했는지 확인해보라. x86으로 돌려야 동작한다. 이조차도 왜인지 모르겠다... (clr 빌드는 Win32로, WinUI3 프로젝트도 x86으로 실행해야 잘 돌아간다.)

 


07.21 추가 작성

 

다음 글에서 더 편리한 것을 발견했다.

이걸 쓴다면 굳이 힘들게 할 필요가 없을 거 같다.

https://junostudio.tistory.com/12

 

[C#.NET] C# 에서 C++ Windows Runtime Component 사용하기

WinRT (Windows 런타임) 라이브러리를 만들어내면 WinMD (Windows 메타데이터)를 출력으로 내보내며 이것으로 다양한 프로그래밍 언어에서 언어 프로젝션을 사용, 이를 이용 할 수 있습니다. 허나 C++ Wind

junostudio.tistory.com