Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0: ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 195

Автор Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ своСм ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern Π±Ρ‹Π»ΠΎ доступно с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° создания Π‘#. Оно ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ прСдоставляСтся Π² нСуправляСмом ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся составной Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΌΠ΅Ρ‚ΠΎΠ΄ прСдоставляСтся внСшним ΠΊΠΎΠ΄ΠΎΠΌ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠ°ΠΊ внСшний, достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Π΅Π³ΠΎ объявлСния ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ extern. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, общая Ρ„ΠΎΡ€ΠΌΠ° объявлСния внСшнСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.


extern Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ_Ρ‚ΠΈΠΏ имя_ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (список_Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²) ;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° отсутствиС Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ примСняСтся вмСстС с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ DllImport, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ DLL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄. Атрибут DllImport ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ пространству ΠΈΠΌΠ΅Π½ System.Runtime.InteropServices. Он допускаСт нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ лишь имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, внСшниС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ слСдуСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π‘. (Если ΠΆΠ΅ это дСлаСтся Π½Π° C++, Ρ‚ΠΎ имя внСшнСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ DLL ΠΏΡƒΡ‚Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ оформлСния Ρ‚ΠΈΠΏΠΎΠ².)

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ стало понятнСС, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ внСшними ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, обратимся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, состоящСй ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»ΠΎΠ². НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ исходный ΠΊΠΎΠ΄ Π‘ ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ExtMeth.с, Π³Π΄Π΅ опрСдСляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ AbsMax().


#include <stdlib.h>

int __declspec(dllexport) AbsMax(int a, int b) {

  return abs(a) < abs(b) ? abs(b) : abs(a);

}


Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ AbsMax() ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ значСния Π΄Π²ΡƒΡ… Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ возвращаСтся самоС большоС ΠΈΠ· Π½ΠΈΡ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ __declspec(dllexport). Π­Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ языка Π‘ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… срСдств ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΠΈ Microsoft. Оно увСдомляСт компилятор ΠΎ нСобходимости ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ AbsMax() ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ содСрТится. Для компилирования Ρ„Π°ΠΉΠ»Π° ExtMeth.с Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС указываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.


CL /LD /MD ExtMeth.с 


Π’ ΠΈΡ‚ΠΎΠ³Π΅ создаСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» DLL β€” ExtMeth .dll.

Π”Π°Π»Π΅Π΅ слСдуСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Π‘#, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ примСняСтся внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄ AbsMax().


using System;

using System.Runtime.InteropServices;

class ExternMeth {

  // Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄.

  [DllImport("ExtMeth.dll")]

  public extern static int AbsMax(int a, int b);


  static void Main() {

    // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄,

    int max = AbsMax(-10, -20);

    Console.WriteLine(max);

  }

}


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° DllImport Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Он увСдомляСт компилятор ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL, содСрТащСй внСшний ΠΌΠ΅Ρ‚ΠΎΠ΄ AbsMax(). Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это Ρ„Π°ΠΉΠ» ExtMeth.dll, созданный Π²ΠΎ врСмя компиляции Ρ„Π°ΠΉΠ»Π° с исходным тСкстом ΠΌΠ΅Ρ‚ΠΎΠ΄Π° AbsMax() Π½Π° Π‘. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° экран, ΠΊΠ°ΠΊ ΠΈ оТидалось, выводится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 20.


ОбъявлСниС псСвдонима внСшнСй сборки

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern прСдоставляСт псСвдоним для внСшнСй сборки, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π² состав ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ сборки с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ элСмСнта. Π’Π°ΠΊ, Ссли Π² сборкС test1 содСрТится класс MyClass, Π° Π² сборкС test2 класс с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ классу ΠΏΠΎ этому ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚.

Для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ псСвдоним ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборки. Π­Ρ‚ΠΎ дСлаСтся Π² Π΄Π²Π° этапа. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ псСвдонимы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ компилятора /Π³, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.


/Π³:Asm1=test1 /Π³:Asm2=test2


А Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом extern, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… дСлаСтся ссылка Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ псСвдонимы. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ„ΠΎΡ€ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° для создания псСвдонима сборки.


extern alias имя_сборки;


Если ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки ΠΊΠΎΠ΄Π°.


extern alias Asml;

extern alias Asm2;


Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° класса MyClass Π±ΡƒΠ΄ΡƒΡ‚ доступны Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ псСвдониму.

Рассмотрим ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ дСмонстрируСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… псСвдонимов. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ исходный тСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» β€” test1.cs.


using System;

namespace MyNS {

  public class MyClass {

    public MyClass() {

      Console.WriteLine("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° MyClassl.dll.");

    }

  }

}


Π”Π°Π»Π΅Π΅ слСдуСт исходный тСкст ΠΈΠ· Ρ„Π°ΠΉΠ»Π° test2.cs.


using System;

namespace MyNS {

  public class MyClass {

    public MyClass() {

      Console.WriteLine("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° MyClass2.dll.");

    }

  }

}


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ…, test1.cs ΠΈ test2.cs, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пространство ΠΈΠΌΠ΅Π½ MyNS ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этом пространствС Π² ΠΎΠ±ΠΎΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… опрСдСляСтся класс MyClass. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π±Π΅Π· псСвдонима ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° класса MyClass Π±ΡƒΠ΄ΡƒΡ‚ нСдоступными Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ исходный тСкст ΠΈΠ· Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° test3.cs, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° класса MyClass ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² test1.cs ΠΈ test2.cs. Π­Ρ‚ΠΎ становится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ благодаря ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ с внСшними псСвдонимами.


// ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с внСшними псСвдонимами Π΄ΠΎΠ»ΠΆΠ½Ρ‹

// Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π°,

extern alias Asml;

extern alias Asm2;


using System;


class Demo {

  static void Main() {

    Asm1::MyNS.MyClass t = new Asm1::MyNS.MyClass() ;

    Asm2::MyNS.MyClass t2 = new Asm2::MyNS.MyClass();

  }

}


Π‘Π½Π°Ρ‡Π°Π»Π° слСдуСт ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ test1.cs ΠΈ test2.cs Π² ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ эквивалСнты DLL. Для этого достаточно ввСсти Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.


csc /t:library test1.cs

csc /t:library test2.cs


Π—Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» test3.cs, ΡƒΠΊΠ°Π·Π°Π² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС


csc /r:Asm1=test1.dll /r:Asm2=test2.dll test3.cs


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° /r, ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰Π΅Π³ΠΎ компилятор ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ссылка Π½Π° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ находится Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС псСвдоним Asm1 связываСтся с Ρ„Π°ΠΉΠ»ΠΎΠΌ test1.dll, Π° псСвдоним Asm2 β€” с Ρ„Π°ΠΉΠ»ΠΎΠΌ test2.dll.

Π’ самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ псСвдонимы ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ extern, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π°.


extern alias Asm1; extern alias Asm2;


А Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() псСвдонимы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСоднозначности ссылок Π½Π° класс MyClass. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ псСвдонима для обращСния ΠΊ классу MyClass.


Asm1::MyNS.MyClass


Π’ этой строкС ΠΊΠΎΠ΄Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ указываСтся псСвдоним, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ пространства ΠΈΠΌΠ΅Π½, Π΄Π°Π»Π΅Π΅ имя пространства ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится класс с Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, имя самого класса, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°-Ρ‚ΠΎΡ‡ΠΊΠΈ. Π’Π° ΠΆΠ΅ самая общая Ρ„ΠΎΡ€ΠΌΠ° ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Π° ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… псСвдонимов.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.


ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° MyClassl.dll.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° MyClass2.dll.

ЧАБВЬ 2 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C#

Π’ части II рассматриваСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π‘#. Как пояснялось Π² части I, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² C# Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° самом Π΄Π΅Π»Π΅ являСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ классов для срСды .NET Framework. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» этой части ΠΊΠ½ΠΈΠ³ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ языку Π‘#, Π½ΠΎ ΠΈ ΠΊΠΎ всСй срСдС .NET Framework Π² Ρ†Π΅Π»ΠΎΠΌ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° классов для срСды .NET Framework ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½. Для использования ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ части этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, достаточно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ пространство ΠΈΠΌΠ΅Π½, ΡƒΠΊΠ°Π·Π°Π² Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using Π² исходном тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ вмСстС с Π΅Π³ΠΎ пространством ΠΈΠΌΠ΅Π½, Π½ΠΎ вСдь Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сразу всС пространство ΠΈΠΌΠ΅Π½.