Visual Studio permet de produire au départ d'un même et unique projet des assemblies pour deux frameworks distincts. Pour cela, il faut utiliser pour le fichier de projet (csproj) le format SDK. Ce projet devient multi-plateformes dès lors qu'il contient cette ligne :
<TargetFrameworks>net8.0-windows;net48</TargetFrameworks>
Lors de la compilation, les répertoires Bin\Debug et Bin\Release sont dédoublés pour chacune des plateformes. Cette topologie est recommandée afin d'utiliser un maximum d'assemblies .net Core dans un Mercator Core, tout en assurant la compatibilité avec le même Mercator en version classique.
Nous fournissons dans le zip ci-dessous un exemple de solution reprenant ce type de projet.
MultipleTargetsProject.csproj : le projet au format SDK est directement éditable et donc modifiable en mode texte.
Cette clause assure que le projet est compatible avec Windows et charge la référence vers System.Windows.Forms.
<UseWindowsForms>true</UseWindowsForms>
Cette clause permet de spécifier les propriétés de l'assembly dans un fichier AssemblyInfo.cs séparé. (Voir ci-dessous)
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
Ce bloc fixe les constantes habituelles de compilation. Et il ajoute la constante MERCATOR_CORE qui est active quand on compile en .net Core. Cela permettra, si nécessaire, de séparer le code .net 4.8 du code .net Core (voir ci-dessous).
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>TRACE;DEBUG</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net7.0-windows' ">
<DefineConstants>$(DefineConstants);MERCATOR_CORE</DefineConstants>
</PropertyGroup>
Ce bloc détermine les références pour le framework 4.8. S'il s'agit de DLL de Mercator, il est nécessaire de référencer des DLL d'un Mercator classique.
<ItemGroup Condition=" '$(TargetFramework)' == 'net48' ">
<Reference Include="MercatorTunnel">
<HintPath>C:\DossiersClientsRefAssemblies\fw40\MercatorTunnel.dll</HintPath>
</Reference>
<Reference Include="MercatorUi">
<HintPath>C:\DossiersClientsRefAssemblies\fw40\MercatorUi.dll</HintPath>
</Reference>
</ItemGroup>
Ce bloc fixe les références pour le framework .net Core. S'il s'agit de DLL de Mercator, il est nécessaire de référencer des DLL d'un Mercator Core. C'est aussi à cet endroit qu'on retrouve les nugets nécessaires pour la version Core.
<ItemGroup Condition=" '$(TargetFramework)' == 'net7.0-windows' ">
<Reference Include="MercatorTunnel">
<HintPath>C:\DossiersClientsRefAssemblies\fw70\MercatorTunnel.dll</HintPath>
</Reference>
<Reference Include="MercatorUi">
<HintPath>C:\DossiersClientsRefAssemblies\fw70\MercatorUi.dll</HintPath>
</Reference>
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
</ItemGroup>
Lors de l'ajout de références vers des assemblies ou vers des nugets via l'interface, Visual Studio ne classe pas correctement ces nouvelles références en fonction du framework. Il convient donc de "corriger" ces références directement dans le projet en mode texte.
Properties\AssemblyInfo.cs
Ce fichier contient les propriétés de l'assembly, dont notamment ce bloc qui permet de fixer une version différente en fonction de la plateforme de compilation. Par convention, chez Mercator, le dernier indice de la version est
- 40 pour une version classique,
- 70 pour une version Core.
[assembly: AssemblyVersion("1.0.0.0")]
#if !MERCATOR_CORE
[assembly: AssemblyFileVersion("1.0.0.40")]
#else
[assembly: AssemblyFileVersion("1.0.0.70")]
[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows")]
#endif
La ligne SupportedOSPlatform permet d'éviter toute une série d'avertissements qui indiqueraient que le code ne peut s'exécuter que sur la plateforme Windows.
Class1.cs
Ce code C# montre comment utiliser une directive de compilation via la constante MERCATOR_CORE afin de différencier le code .net 4.8 du code .net Core.
public void Test()
{
string url = "https://...";
#if (MERCATOR_CORE)
MercatorHttpClient.HttpClient client = MercatorHttpClient.HttpClient.Create(url);
#else
System.Net.HttpWebRequest client = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
#endif
client.Timeout = 2500;
StringContainer stringContainer = client.GetData<StringContainer>(out string error);
}
Voir cette page.
A télécharger :
0000003165.zip (6 Kb - 19/12/2023)