سلام،
برای اینکار نیاز هست که یکی از SDK های Targeting pack رو برای خودتون نصب کنید:
این دو تا هم نصب کنید:
(عکس ها از برنامه ویژوال استودیو اینستالر هستن، از نسخه 2017 ویژوال استودیو به بعد یکی هستن، پس روی 2019 و 2022 هم همینجوریه)
بعد باید فایل csproj کتابخونه ای که ساختید رو به این شکل در بیارید:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net4.0;net452;netstandard2.0;net 5.0</TargetFrameworks>
<Authors>Ramtin Jokar</Authors>
<Description>Ye tozihi rajebe library</Description>
<PackageTags>tag</PackageTags>
<AssemblyVersion>1.0.1.0</AssemblyVersion>
<FileVersion>1.0.1.0</FileVersion>
</PropertyGroup>
</Project>
نکته: دو تا TargetFramework وجود داره، یه دونه ش تهش S نداره که برای سینگل پلتفرم هست، اینی که من استفاده کردم برای مولتی پلتفرم ساپورت استفاده شده(البته از TargetFrameworks هم میشه برای سینگل پلتفرم استفاده کرد).
نکته: پلتفرم ها با سمی کالن ; جدا میشن که آخرین مورد نیازی نیست بذارید.
من در بالا برای دات نت فریمورک 4 و 4.5.2 و نت استاندارد 2.0 و دات نت کور 3.1 و دات نت 5.0 ست کردم شما میتونید هر کدوم رو میخواید حذف کنید یا اضافه کنید.
نکته: برای بیلد این پروژه نیاز هست که کلیه SDK های اون رو نصب داشته باشید.
نکته: برای نصب یک پکیج یا ریفرنس یک پروژه به یکی از پلفترم ها، میتونید از Condition استفاده کنید:
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'"> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
</ItemGroup>
مثلا اینجا نوگت Microsoft.CSharp نسخه 4.7.0 رو نصب رو برای پکیج دات نت استاندارد لایبرری نصب میکنه.
اگه میخواید یک کتابخونه نوگت رو برای همه ی پلتفرم ها نصب کنید Conditionرو حذف کنید:
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
نکته: اگه نسخه رو ننویسید، آخرین نسخه رو براتون نصب خواهد کرد.
برای استفاده از کدی که توی یک فریمورک وجود داره اما توی دیگری وجود نداره، میتونید از پِرِه پراسِسور ایف ها استفاده کنید:
#if NET40
// کد برای دانت فریمورک 4.0
#else
// کد برای بقیه
#endif
برای مثال داخل دات نت 4 تسک ها وجود ندارند و درست کار نمیکنند، اگه بخوایم تابعی بنویسیم که برای دات نت 4.0 و بقیه دات نت ها تفاوت داشته باشه اینجوری مینویسیم:
public
#if NET40
string
#else
async Task<string>
#endif
GetSomethingFromNet()
{
var url = "https://barnamenevis.org/showthread.php?566479-کار-کردن-DLL-ساخته-شده-برای-همه-ورژن-های-NET";
#if NET40
using (var webClient = new WebClient())
return webClient.DownloadString(url);
#else
using (var httpClient = new HttpClient())
return await (await httpClient.GetAsync(new Uri(url)).ConfigureAwait(false)).Content.ReadAsStr ingAsync().ConfigureAwait(false);
#endif
}
حتی میتونید نام تابع ها رو هم برای هر فریمورک(پلتفرم) عوض کنید:
public
#if NET40
string
GetSomethingFromInternet()
#else
async Task<string>
GetSomethingFromInternetAsync()
#endif
{
var url = "https://barnamenevis.org/showthread.php?566479-کار-کردن-DLL-ساخته-شده-برای-همه-ورژن-های-NET";
#if NET40
using (var webClient = new WebClient())
return webClient.DownloadString(url);
#else
using (var httpClient = new HttpClient())
return await (await httpClient.GetAsync(new Uri(url)).ConfigureAwait(false)).Content.ReadAsStr ingAsync().ConfigureAwait(false);
#endif
پروژه ای که ساخته شد:
https://github.com/ramtinak/MyClassLibrarySample
موفق باشید.