g | x | w | all
Bytes Lang Time Link
000C#250908T175510Zromfir
004C#250908T173517Zromfir
033C#250721T155233Zromfir
094C#120418T212018ZCristian
085C#120426T045555Zmizer
076C#130803T090731ZTimwi
114C#120418T225602Zmellamok
115115 Bytes120417T182509Zprimo

C# 0 chars

using .NET 8 csproj like this:
   <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="HelloWorld.SourceGen" Version="1.0.0" />
  </ItemGroup>

</Project>

where HelloWorld.SourceGen is previously created Nuget Package which contains Source generator like this:

using Microsoft.CodeAnalysis;

namespace Generator;


[Generator]
public class Class1 : IIncrementalGenerator
{

    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        context.RegisterPostInitializationOutput(ctx => ctx.AddSource("Hello.g.cs", "Console.WriteLine(\"Hello World\");"));
    }
}

HelloWorld.SourceGencsproj:

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <LangVersion>latest</LangVersion>

        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <PackageId>HelloWorld.SourceGen</PackageId>
        <Version>1.0.0</Version>
        <IncludeBuildOutput>false</IncludeBuildOutput>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.1">
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
    </ItemGroup>

    <ItemGroup>
        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>

</Project>

it is possible to create an empty C# program and after execution "Hello World" will be printed.

C# 4 chars

using .NET 8/9 csproj like this:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="HelloWorldLib" Version="1.0.0" />
  </ItemGroup>

  <ItemGroup>
      <Using Include="HelloWorldLib.C" Static="True"/>
  </ItemGroup>

</Project>

where HelloWorldLib is previously created Nuget Package which contains only one class like this:

using System.Runtime.CompilerServices;

namespace HelloWorldLib;

public class C
{
    public static object F;

    [ModuleInitializer]
    public static void M1()
    {
        Console.WriteLine("Hello World");
    }
}

HelloWorldLib's csproj:

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>

  <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>

it is possible to create a C# program with just 4 characters:

_=F;

(A module initializer is executed at, or sometime before, first access to any static field or first invocation of any method defined in the module. link)

Note: it is probably possible to write a source generator and put it in a package that would generate Program.cs with Console.WriteLine("Hello World"), that would make a C# program 0 chars :)

C# 33 chars

using .NET 8/9 csproj like this:
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
    <Using Include="System.Console" Static="True"/>
</ItemGroup>

code:

if(Write("Hello, World!")is GC){}

C# 96 95 94 chars

A bit of a cheat, but works if you have IronRuby installed:

class P{static void Main(){if(IronRuby.Ruby.CreateEngine().Execute("puts'Hello World'")>1){}}}

C# 85 chars

class H{static void Main(){if(System.Console.Out.WriteAsync("Hello, world!")is H){}}}

C#, 76

class X{static void Main(){if(System.Console.Write("Hello, World!")is X){}}}

I tried this in my VS2012 and it works just fine, even though it is quite a surprise that you can apply the is operator to void...

C# (114)

class M{static void Main(){if(typeof(System.Console).GetMethods()[78].Invoke(null,new[]{"Hello, world!"})is M){}}}

Note that the proper index for Write(string)/WriteLine(string) may be different on your system. However, since there are only 106 methods total, I'm almost certain either Write(string) or WriteLine(string) will be a two-digit index number on every system, so the character count should be generally valid.

Demo: http://ideone.com/5npky (Write method is apparently index 23 here)

115 Bytes

class H{static void Main(){if(((System.Action)(()=>System.Console.Write("Hello, world!"))).DynamicInvoke()is H){}}}

It's likely possible to produce something a bit shorter, but I'm pretty sure that you're going to need make some sort of asynchronous call.