.csproj可以按平台切换本机代码吗?

时间:2019-05-12 16:22:10

标签: c# .net-core .net-standard

我正在学习C#。 (对不起,我不是英语母语的人。)
我正在dotnet核心中创建多平台库。
我想用一种方法切换平台。
我尝试了RuntimeInformation.IsOSPlatform(),然后成功了。

我听说可以通过project.csproj的属性来更改每个操作系统要执行的代码。
但是我做不到。

我想这样做。

project.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>library</OutputType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <PackageId>MemoryInfo</PackageId>
    <Version>1.0.0</Version>
    <Authors>foobar</Authors>
    <Company>foobar</Company>
    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
  </ItemGroup>

//(add comment) Switch Native Code
  <ItemGroup Condition="'$(TargetsWindows)' == 'true'">
    <Compile Include="Linux/native.cs" />
  </ItemGroup>
  <ItemGroup Condition="'$(TargetsLinux)' == 'true'">
    <Compile Include="Windows/native.cs" />
  </ItemGroup>
</Project>

Program.cs

~~
  public long GetMemorySize() //library method
  {
    NativeMemoryinfo mem = new NativeMemoryinfo();
    return mem.GetMemorySize(); //access to each platform code
  }
~~

Linux / native.cs

~~
  class NativeMemoryinfo
  {
    public long GetMemorySize()
    {
        Code for Linux(/proc/meminfo...)
     }
  }
~~

Windows / native.cs

~~
  class NativeMemoryinfo
  {
    public long GetMemorySize()
    {
        Code for Windows(Kernel32....)
     }
  }
~~

也许,我认为我被误解了或以错误的方式。 我可以这样吗?
在我的研究中,我发现了一种叫做“互操作” this的东西,但是与此有什么关系呢?

谢谢。

2 个答案:

答案 0 :(得分:2)

您要与csproj一起使用的功能通常用于.NET中的不同框架,而不是不同的OS。看到这个:https://docs.microsoft.com/en-us/dotnet/standard/frameworks

您要尝试执行的操作可以通过接口实现。有一个接口INativeMemoryinfo并将其初始化为基于if (RuntimeInformation.IsOSPlatform() == "")的Windows或linux版本。

旁注:由于您正在使用库,因此我建议使用.net标准而不是.net核心。

答案 1 :(得分:-1)

if(RuntimeInformation.IsOSPlatform()==“”)。