2026-06-17 00:35:16 +02:00
<Project Sdk= "Microsoft.NET.Sdk" >
<ItemGroup>
<ProjectReference Include= "..\VoiceCat.Interop\VoiceCat.Interop.csproj" />
</ItemGroup>
2026-06-22 15:20:11 +02:00
<!-- Prismatoid — .NET bindings for the Prism speech library, used for spoken event
announcements (text-to-speech). net10.0, no transitive dependencies. -->
<ItemGroup>
<PackageReference Include= "Prismatoid" Version= "0.3.0" />
</ItemGroup>
<!-- Event-cue WAVs (shared with the macOS/iOS clients) copied into sounds\ next to the exe;
SoundPlayerPool loads them from AppContext.BaseDirectory\sounds. -->
<ItemGroup>
<Content Include= "..\..\..\assets\sounds\*.wav" >
<Link> sounds\%(Filename)%(Extension)</Link>
<CopyToOutputDirectory> PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
2026-06-17 00:35:16 +02:00
<PropertyGroup>
2026-06-18 21:29:47 +02:00
<OutputType> WinExe</OutputType>
2026-06-17 00:35:16 +02:00
<TargetFramework> net10.0-windows</TargetFramework>
<Nullable> enable</Nullable>
<UseWindowsForms> true</UseWindowsForms>
<ImplicitUsings> enable</ImplicitUsings>
<ApplicationManifest> app.manifest</ApplicationManifest>
<AssemblyName> VoiceCat.App</AssemblyName>
<RootNamespace> VoiceCat.App</RootNamespace>
<!-- Per-monitor v2 DPI awareness (correct scaling on multi-monitor/high-DPI — matters for
low-vision users as much as general UX). Set via this property, not app.manifest —
WinForms' own analyzer (WFO0003) flags manifest-based DPI settings as superseded by
this property in modern .NET. -->
<ApplicationHighDpiMode> PerMonitorV2</ApplicationHighDpiMode>
2026-06-22 00:19:38 +02:00
<!-- WASAPI process-loopback COM interop in Audio/ProcessLoopbackCapture.cs uses unsafe
pointer arithmetic for PROPVARIANT/AUDIOCLIENT_ACTIVATION_PARAMS marshaling. -->
<AllowUnsafeBlocks> true</AllowUnsafeBlocks>
2026-06-17 00:35:16 +02:00
</PropertyGroup>
<!-- System.Security.Cryptography.ProtectedData (PasswordProtector.cs's DPAPI wrapper) ships
as part of the Windows Desktop shared framework on net10.0-windows — no PackageReference
needed (one was tried and NuGet flagged it as redundant/unprunable, NU1510). -->
<!-- voicecat.dll must exist (build the `windows-client` CMake preset first — see
clients/windows/README.md). -->
<ItemGroup>
<Content Include= "$(VoiceCatNativeDir)\voicecat.dll" Condition= "Exists('$(VoiceCatNativeDir)\voicecat.dll')" >
<Link> voicecat.dll</Link>
<CopyToOutputDirectory> PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Target Name= "VoiceCatCheckNativeDll" BeforeTargets= "Build" >
<Error Condition= "!Exists('$(VoiceCatNativeDir)\voicecat.dll')"
Text= "voicecat.dll not found at '$(VoiceCatNativeDir)'. Build it first: cmake --preset windows-client && cmake --build --preset windows-client (see clients/windows/README.md)." />
</Target>
</Project>