From b023bec083b298106a3bce650a7b2b2ab35e2ccc Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sun, 22 Jun 2025 13:55:45 +0200 Subject: [PATCH 1/8] ci: add msbuild job --- .github/workflows/build.yml | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 31356e28de..2812fa27a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -218,6 +218,46 @@ jobs: with: path: integration-test + msbuild: + needs: build-sentry-native + name: MSBuild + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Download sentry-native (Windows) + uses: actions/cache/restore@v4 + with: + path: src/Sentry/Platforms/Native/sentry-native + key: sentry-native-Windows-${{ hashFiles('scripts/build-sentry-native.ps1') }}-${{ hashFiles('.git/modules/modules/sentry-native/HEAD') }} + fail-on-cache-miss: true + enableCrossOsArchive: true + + - name: Setup Environment + uses: ./.github/actions/environment + + - name: Build Native Dependencies + uses: ./.github/actions/buildnative + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2 + + - name: Run MSBuild + id: msbuild + run: msbuild Sentry-CI-Build-Windows.slnf -t:Restore,Build -p:Configuration=Release --nologo -v:minimal -flp:logfile=msbuild.log -p:CopyLocalLockFileAssemblies=true -bl:msbuild.binlog + + - name: Upload logs + if: ${{ steps.msbuild.outcome != 'skipped' }} + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.target || runner.os }}-msbuild-logs + path: | + msbuild.log + msbuild.binlog trim-analysis: needs: build-sentry-native From 8299d31fc34215d07333d2f17818b63c877854b6 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sun, 22 Jun 2025 11:28:51 +0200 Subject: [PATCH 2/8] fix: build with Visual Studio > Sentry.Native.targets(37,14): error MSB4186: Invalid static method invocation syntax: > "[System.Runtime.InteropServices.RuntimeInformation]::RuntimeIdentifier". > Method 'System.Runtime.InteropServices.RuntimeInformation.RuntimeIdentifier' not found. > Static method invocation should be of the form: $([FullTypeName]::Method()), e.g. $([System.IO.Path]::Combine(`a`, `b`)). > Check that all parameters are defined, are of the correct type, and are specified in the right order. --- src/Sentry/Platforms/Native/Sentry.Native.targets | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Sentry/Platforms/Native/Sentry.Native.targets b/src/Sentry/Platforms/Native/Sentry.Native.targets index befa26d123..05114b9d53 100644 --- a/src/Sentry/Platforms/Native/Sentry.Native.targets +++ b/src/Sentry/Platforms/Native/Sentry.Native.targets @@ -34,35 +34,35 @@ - + true \sentry-native\$(NativeLibRelativePath-win-x64) - + true \sentry-native\$(NativeLibRelativePath-win-arm64) - + true \sentry-native\$(NativeLibRelativePath-linux-x64) - + true \sentry-native\$(NativeLibRelativePath-linux-musl-x64) - + true \sentry-native\$(NativeLibRelativePath-linux-arm64) From 34b35364af7d35a3b3e3a4982433dbcb7f8c215d Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 19 Jun 2025 15:17:14 +0200 Subject: [PATCH 3/8] test: import winui-app for testing purposes --- test/WinUITestApp/App.xaml | 24 ++++++++++ test/WinUITestApp/App.xaml.cs | 44 +++++++++++++++++ .../Assets/sentry-wordmark-dark-300x90.png | Bin 0 -> 6851 bytes .../Assets/sentry-wordmark-light-300x90.png | Bin 0 -> 6779 bytes test/WinUITestApp/MainWindow.xaml | 34 +++++++++++++ test/WinUITestApp/MainWindow.xaml.cs | 29 +++++++++++ .../PublishProfiles/win-arm64.pubxml | 14 ++++++ .../Properties/PublishProfiles/win-x64.pubxml | 14 ++++++ .../Properties/launchSettings.json | 7 +++ test/WinUITestApp/WinUITestApp.csproj | 45 ++++++++++++++++++ test/WinUITestApp/app.manifest | 19 ++++++++ 11 files changed, 230 insertions(+) create mode 100644 test/WinUITestApp/App.xaml create mode 100644 test/WinUITestApp/App.xaml.cs create mode 100644 test/WinUITestApp/Assets/sentry-wordmark-dark-300x90.png create mode 100644 test/WinUITestApp/Assets/sentry-wordmark-light-300x90.png create mode 100644 test/WinUITestApp/MainWindow.xaml create mode 100644 test/WinUITestApp/MainWindow.xaml.cs create mode 100644 test/WinUITestApp/Properties/PublishProfiles/win-arm64.pubxml create mode 100644 test/WinUITestApp/Properties/PublishProfiles/win-x64.pubxml create mode 100644 test/WinUITestApp/Properties/launchSettings.json create mode 100644 test/WinUITestApp/WinUITestApp.csproj create mode 100644 test/WinUITestApp/app.manifest diff --git a/test/WinUITestApp/App.xaml b/test/WinUITestApp/App.xaml new file mode 100644 index 0000000000..c0bf5d47a3 --- /dev/null +++ b/test/WinUITestApp/App.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/WinUITestApp/App.xaml.cs b/test/WinUITestApp/App.xaml.cs new file mode 100644 index 0000000000..5827f3b8e0 --- /dev/null +++ b/test/WinUITestApp/App.xaml.cs @@ -0,0 +1,44 @@ +using Microsoft.UI.Xaml; +using Sentry.Protocol; +using System.Security; +using Sentry; + +namespace winui_app +{ + public partial class App : Application + { + private Window? _window; + + public App() + { + SentrySdk.Init(options => + { + options.Dsn = "http://key@127.0.0.1:9999/123"; + options.Debug = true; + options.IsGlobalModeEnabled = true; + }); + UnhandledException += OnUnhandledException; + + InitializeComponent(); + } + + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + _window = new MainWindow(); + _window.Activate(); + } + + [SecurityCritical] + private void OnUnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) + { + var exception = e.Exception; + if (exception != null) + { + exception.Data[Mechanism.HandledKey] = false; + exception.Data[Mechanism.MechanismKey] = "Application.UnhandledException"; + SentrySdk.CaptureException(exception); + SentrySdk.FlushAsync(TimeSpan.FromSeconds(2)).GetAwaiter().GetResult(); + } + } + } +} diff --git a/test/WinUITestApp/Assets/sentry-wordmark-dark-300x90.png b/test/WinUITestApp/Assets/sentry-wordmark-dark-300x90.png new file mode 100644 index 0000000000000000000000000000000000000000..a11de3b60f6c63f4680e6a862d404fee1619be79 GIT binary patch literal 6851 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 Dt0d6h literal 0 HcmV?d00001 diff --git a/test/WinUITestApp/Assets/sentry-wordmark-light-300x90.png b/test/WinUITestApp/Assets/sentry-wordmark-light-300x90.png new file mode 100644 index 0000000000000000000000000000000000000000..e9077036b4c0f1f078a2a2ae16b113424f342070 GIT binary patch literal 6779 zcmX9@bzGC*+Xf^y%F&@9AvGGL1z~hI49S6%2m@*O(xbb(bL2oe1f~emp@g)El$1;w zeCO}|=c&(i*E#2To^xMUte%c488IU<4h{~Px|)&!4h}9K_WC7&5PQV)aACrpa6JuF zAvlebkN0qJ7{%0;6pZ|=4lRk?jg0B!7I))nSk%&!)bx4c0GI3~;Rf5)3wnyWte9y{ zN)`;I^enyth?>I42x|qZ0K~8m)7F-SUru%WLx1X!xB~1TP_!1ecS~3Xp)q4iX0l!6GNhzlUKT<51By z{SW*IKL>^WsedZZfV~CAFW|5b01#w&T2RhODt3rADx7X%LJ=Ei0Y_bxmahP zzOCWG+7Kx2h!t;IW}tl-O7t0< z+s}Ux4nYPbf97%5XFY?dhI>CcUeIT5L;g8n##RXvbNlmH3~oI||8+}MXKq?5F zqGaBv!9>{^;$~@lkM~dyee2YH*uMOH)Z+F~#40cQ)kHS*8_;Lh3 z>Lz9AJrDfp7`Oj?Z+>0o!WlC4HADm40o(R@*>`z39ZdXO`u`(T0C^3ov@(PQ^O(UI zs(Is`o&H`M@pc{eMf|EJ8dlV*Qb&_N_0NkR{nhJFqT09*q^-`LtrpUxUrqTZ=DrDYG4(=9E%r2C@q*`M1iN|$0AVQ{^}iN{`5BZh*TD-- z>m|5_oUeVgB;~%-^Tc(si$bDFgt619#tLddd}VE+_!@ZS46OgdyH+Wt+5TE#+*;@% z$9Q}i^~p}~Z6={to{|K7jTA{V5COxd$MwXAq@jqZCl6*VV}CCTX4iyN$6`7r8myy> z5^Jm!bAM$`E~&vA{!TwG1o4>d&qO2rkdO=sYq#!;_dUSt?iY<#bjBjETwVGxJz$T`!m34Ht?x@rUeK`s&5bMpmv~ zHN$oMZ?(meLdhUbY9AqDDqKMyXbxv1c^kz}cG~(AYS)5veZYE`3dmpEnx=c>NKX~l z99pmi-wXSxBYz0QGNi~;jdFfkeHHnJz+XX^>0N@{oqIpO)l!S2$CB%6A#b#*8DCED z;c$-?MlU-pnYy%F(6k(^o6XMmhDyr&J73Vrq*Xx30dx2HaB;hFp08gKV@JKK`D8I3 zOWj~!nrz-knwTj6HzAeRK8LfuPOEjxw|hq>t3fkZ_PyMJLATXmRpX1ShRMLO-+^J?3-1OG z8E1WzYe)9(5U1FGN7qd+{#N-)gg_3mT-j4vb!OvGEe>N4l7(awa+j5oD=(XM{oArunSIi~9HQkN0YEa*`cN)1tX_n2-PoNpucqx{d|yc6 zQ6p6nA4`&#*2Oo zQ9!_Zeec)n<)vQ;-S$1~j*}78Ffr%5$9=Op=XAI3H#^T<(#~9;mdPX(FX^IpMh1_$ zg9o%i+(|T6b^7x43JF_I>v}{#-lC6y?G6O-BLRS~B`0l%b8e3Wq94wWEq3}p-9JK&X=}uK>?t+i6+(@a!tH`;ddMD&Q5o9uyxUMA zqLb6nrima8i0BJNo2yUy@1A9bH5A>!cmN z6jWEQ6D=m~kfa~T?PZ!JgS4%jHTskLHiNf=>#Fn7plD2zT8d9YvMIl!aJjU4P~XM5 z<1_fE%O^V&?c-cKmCuXr|#-k1?RNxFK@Am9uT{n>_e^F!rlYg%=zJ4k96pZ@5~T z+tIGx0~39(ohxDdT62b<7*}-Y?b5_nf3d!#=$Sq*xj*L&gKPLUH!L2d?_oYaDfCgO z((vUXiF(d2)Mc({IycI|(QU%yo6k;0uuQM0MchY^SuOnI?UM?8z9la{rl!xZ% z=Dt;S_OpHH{F0qSV<227B0 zrW%PK?rpp1VB6!&Mgz_)>ujbl(C2c^!E9+VWKKOz>Zii<8mfO}SVJ+Nwgl&fXa7oS zuf4K=g~nq(RhI=44x0=fK5@e}o(=Jn$(|_Y=Il7zW)@VB81_xww{?tUGGXC(1ss!A zUo`YSS~aRm@P$Y|Q1z{fGuF_&OpGnu+KpitAqs7Oy$~|1JZW-u|0DSs>gI>M@AiyU z4F#>2L{M~VDVK{;%FjOAL5FXxpKfP4%Bg7GmOT#KXjZ7nk0lhls@!3s_AtK9PB)sK zkv=_z4KBW|4jQ$@Yuzpfo2?Z@2%Q}chmDjsG{2gyVMT3GmN z2cfj@D5(kS4-hMWOIyjQj~7FHXSAMyvraetDVgcY*^)QlECq%jc(>sRSQ z6?)cg&_@(kn7}-WtUu$u@C(+L;&7@v%m=~t^w3qUIdSid?GinN?M%M>CJBktsrZA* zk3ljz)7LgjxAkC@Zq7&KJIf8uTQcfJIEZC- zPN}~=}$0*0+YUqnv$m5e(r1c;_bVy?VDJ9CumgJc$cSs@-pJ#fHU*K zFxb8G$+T41#ybW+bt*Jogxzuzd*2@vE~zOd*Z}o-{NnTZj3F4_yvXo zqo}T~_QB0`z@$_PDM zC|A(vvYUhbfjupjFMu$E3$isxIH}zC@+A5Eu1zjPb&S#BV*HTc0kIECHUlw>I%`Vy z{%i6!CRQ;D<+$T|fxT0J>PdAw=<@s4l^5ZxTM+$5@*C^jCvn-tn(>+V*SVS6&Y+pLxo%n$_xn&Vs%d z;Etv|TWhqNDVpTqq`oC>UWVi(1(4NgGXL>;NYih(5V_3w%fy>f01NXn?IFCQ;a>XZBRI`T*HjECCGf8>h z3F9s=h@ha277cvH^%g2f-?=uD?@XfZ0(Ui1;slwf-cB7UDaw~Sv^48sU>@7ZLCF0f z*%SW((4;EFdLb72P-6WZrRfb#1Q`DQ#;FzrnE96cS)EhwOhE>z0<8rg=tGw=Pd=5- zu**>57yy&#*4{tw)J8X?aZ4HmoFzsC(Iu!4m4xZNiue_LC)N6!0o_HTT0xmi&AGej z<=5qbntY?v zYjYX;bgSE5SwCZ*B-gFz(T;a~^3>Ja-rs&ofDBxT8O%uI%Xg`ufk}OZnVm+b^83tP zPD7QS{&bh4yzX8@rAMuA7g<_UW&8@G{?+m^d8<|#KJ%!~2fyXfa(lQAR9aE{ztdC@ zgvRr+us6tDmBT}}8q~OEjAsbU(TXY4K(J(m8JK1&3}tu9x7QGr;*2mC;gk*c_SD5x zeW)~_Yh~lJ_JtmGJvY1o?lUYyAQa-SCGix|{?P?|-3II(O0PTk*+)A(F=^Exb#lh~{QHb)&@K$qQqO`Cg>Uo~$4j zv-JY1BS2vlwr6l>BY%<_(Nv(5l45&u**N-$7%u)~WGTCsdy?j21?=vj@EZs(3k3dh z14o?N+&WVQ$J&lxNSO4i*3r71I*B&`#@3m#0x7o~FqP4oehvxyOKI%7vlWLAlg!y zjVL9VTkUxmKD9LNXAVJTB}pqYf)4(mZ^;)@Lj6tg9~T0^TMEW#~O%85B6#M;z8F69!X%Yqx4@=1!!ii>^|`bC#P#` zI08k3%AN%_Vki={sC)Dn-kFl8hyTv!p7HKTyysLFvZN2=UO4HWGKkj^40u-gJDqgs zL_}w&=?of5X>~hYDS^f_kq$Z@sWJ1C42`?MIzJk!ew)!MFg|f0SF(M!_NCFdupy&E zYp^>57DI&Ja>m*1K01gIRl>y7Y#us)E=U~xa-?JRV=dyPVcSa@+1i?M$m|0cEG=dY zmUhP}OG&FGOSz+}`Qvu%DxP{-Y$mlXt3xcS6hI3PJ=dM{xozN7+P8qn?eWh?O{=?%; zIrJ=HTd|_{lL$HlH#BKD#5f2^)gv7{652 zIob$cz}KvdUMZ@WywdNDMCiL_QxG%<#_P9F>0RKl7#oz>86w@3QfZv#@-6@~yjldr zi(z)`HAYKp%*LS52D|c71JS)$RLO9-oMz>*m+tdEO4^^*o&oJWi4vCP3|S}~5X71V zKZ+am87)q`Y?fK`rgGzCxqOJ*-h`$Csp?0mzad1j%m+6p(X-OXdBRT&z&rvNq8*Rw(72B)1+kLPK;gGMJ99YN9W1Bz9ozqikT@hl&Y9K-J1BRM?C$ zJW;togjvM?lB~rot7(Nnp?p)Mk?DJl8tlf`zs4=vvWk2)4d8rmm+Iv_k0U#tsoDQ% z6R%Pz<3kyXgM_Vbol#e{&tD^-j!m8zbS^o8QbK!}@!@I=R6xIyLvWa93N^kC^aa@j%?1P!+gACtJO z?aR)UOeOUxRmg>fH<)f!VA(6EvWJ~ji@r>ywO=gczX=D9`W9^=T*rB|@>$?Ul%>M@ z`BoJ_~ra= z2TcyR6Sou760iy9#0e2kQ*`B1~ba7f6FHsJo1(#=+V6+mj4UeVB4UB?ftT< z_lVVsUU!xEA1B|wRkq~&&Zx3nh z;9b3DS7lsns9J>(To3q-)^iyd{%uL2A>Ky{rWVI8!Ppag>5JuMQz%YyQ6SORg9qi6 zw0)66?SVLI3&y*f|1l4F5yG+LfuegRDsIw|+}=ncH3ozm?hRJw5zgqhVNQOH?cb+w zj{T-ecUzwbOkqna0$gfAog6l=XJ(DL3_gCin4nW2=9;lF$o@lUIuCfjP7L|6)_IzY zxu||^>}9rTZoeJQ-|CV0SRUl?piH=~hndaaC+5x5wukY*%cC)axIu#v2mhFN93ZdT z8^l)YzRr_@`#x2t+Z1a1woG%X0`VPvD>~h}H<7jiE-HZJkmM5ESW6NgL2wwGCFaaigx-==!16y<%VnRghlL5TWB(|7X54-N$wX~}$OE7x zx|eOGP9qDRtJbj|oIka?7k(wh$_KqZKaiYB^+!xS_!*ZVPpCQoN8<&P<$d)c0Fgxb zy;HlmP^%Hu;x}*Z%ovat>yUR?AS3iy;bc!)0|5XqTx#yYIyu8N@3CkUUsxK|u#U@C z-%a3S^TBUibOg-0CHGCLTHhLBuy+|jl;engVi+N z+YO6hbq6(+2lahZfem36%6p^XKp z*<*za0|xh_BrJXZpK2&@%=cF(Cl*v8f^~}|mGu3$I^Sc(l5H6ui*zi=fB`F)7!elq z*kO6^b!@!fOfrrCWC + + + + + + + + + + + +