.NET, přesněji jeho Common Language Runtime (CLR) právě platformovou přenositelnost, včetně přenositelnosti mezi 32 a 64 bity řeší velmi dobře.
Pointery CLR používá interně, nikoliv navenek (s výjimkou kódu v tzv. "unsafe" bloku, který ale není úplně unsafe a zůstává také do značné míry pod kontrolou runtime). Tedy vy jako programátor v jakémkoliv z CLR-kompatibilních jazyků (např. C#) nemůžete používat pointerovou aritmetiku, ale samozřejmě můžete odkazovat na objekty pomocí referencí. A tyto reference jsou zkompilovány a INTERNĚ implementovány jako pointery přímo na daný objekt nebo jeho metodu.
V Javě je takový odkaz vždycky nepřímý - je to vlastně handler, tedy odkaz na pointer, který teprve ukazuje na objekt. A pokud chceš zavolat metodu objektu, jde řízení programu na handler, pak na pointer na tabulku (de facto vždy virtuálních) metod objektu, pak to v této tabulce najde požadovanou metodu a teprve jde na metodu. Takže primitivní zavolání metody objektu v Javě je asi čtyřikrát pomalejší a vezme nejméně dvakrát více paměti, než v C#.
A na 64bitové platformě Java ztratí více, než C#, protože tam jsou delší pointery a Java jich V KAŽDÉM PROGRAMU použije na stejnou práci dvojnásobek i více, než C#.
CLR program se kompiluje dvakrát:
1. Do IL (intermediate language). To je ekvivalent bytecode Javy. Ale protože bytecode Javy byl původně navržen pro interpretovaný provoz, je při stejném zdrojáku dvakrát i vícekrát delší, než IL v CLR.
2. Do strojáku. Tato kompilace se provádí buďto při instalaci nebo just-in-time. Jsou k dispozici dva kompilery (a) velmi rychlý, ale primitivní "code expander" (b) pomalejší kompiler, který provádí základní optimalizaci pro cílovou platformu - pro to konkrétní PC, na kterém program poběží.