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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

Π₯отя срСдства ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ связывания C# ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ трудностСй RCW, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, связанных с этим, нСдостатках.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ: ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ опасным. ΠŸΡ€ΠΈ использовании Ρ€Π°Π½Π½Π΅Π³ΠΎ связывания компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° COM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… COM ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚. ΠŸΡ€ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ связывании Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ прСпятствуСт ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ΅ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° InvokeMember(), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²ΠΎ врСмя выполнСния.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ: ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ использовании InvokeMember() Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ссылкС срСда Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΠΉΡ‚ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‡Π»Π΅Π½ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса COM. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ: написаниС ΠΊΠΎΠ΄Π° с ΠΏΠΎΠ·Π΄Π½ΠΈΠΌ связываниСм ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ трСбуСтся ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° COM, IDE VS.NET Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Intellisense, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ списками Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², поэтому Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

ИспользованиС элСмСнтов управлСния ActiveX Π² .NET

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния ActiveX являСтся частным Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° COM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ мноТСство интСрфСйсов для обСспСчСния графичСского прСдставлСния. Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ стандартныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ COM для использования Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… .NET, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты управлСния ActiveX. Π­Ρ‚ΠΎ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° AxImp.exe.

AxImp.exe

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ActiveX Π² срСду .NET, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° AxImp.exe вызываСтся ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Команда состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

1. ИмСни AxImp.

2. ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ActiveX (*.осх), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим снимок экрана, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅. Π—Π΄Π΅ΡΡŒ импортируСтся элСмСнт управлСния ActiveX Win32 MAPI ΠΈ опрСдСляСтся располоТСниС Ρ„Π°ΠΉΠ»Π° .осх (C:\windows\system\msmapi32.осх):

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° AxImp.exe Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» MSMAPI.dll являСтся прокси для сборки. Он позволяСт ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ActiveX, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ это Π±Ρ‹Π» нСграфичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ свойств Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства нСграфичСского класса.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» AxMSMAPI.dll являСтся элСмСнтом управлСния Windows. Он позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ графичСский аспСкт ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта управлСния ActiveX ΠΊΠ°ΠΊ элСмСнт управлСния Windows Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Forms Windows .NET.

ΠŸΡ€ΠΈ использовании AxImp ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ для этих Π΄Π²ΡƒΡ… Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ явныС ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² Π±Π΅Ρ‚Π°-вСрсии SDK .NET AxImp.exe ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π±Π΅Π· прСдупрСТдСния.

Бсылка Π½Π° сборку прокси ActiveX

Как сказано Π²Ρ‹ΡˆΠ΅, Π²Ρ‹Π²ΠΎΠ΄ сборки прокси ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ AxImp.exe позволяСт ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ActiveX ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ Π±Π΅Π· использования графичСских аспСктов. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылку Π½Π° прокси сборки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Reference Π² IDE VS.NET послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ AxImp.exe сдСлаСт свою Ρ€Π°Π±ΠΎΡ‚Ρƒ:

ПослС создания ссылки Π½Π° сборку прокси ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ActiveX. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прокси MSMAPI32.осх для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ сообщСния:

public static int Main() {

 MAPISession objSession=new MAPISession();

 MAPIMessages objMessage=new MAPIMessages();

 objSession.Password="password";

 objSession.UserName=" [email protected]";

 objSession.SignOn();

 objMessage.SessionID=objSession.SessionID;

 objMessage.Compose();

 objMessage.MsgSubject="MAPI Contol Test";

 objMessage.MsgNoteText="The message body.";

 objMessage.RecipAddress=" [email protected]";

 objMessage.ResolveName();

 objMessage.Send(null);

 objSession.SignOff();

 return 0;

}

Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнта управлСния ActiveX Π² WinForm

Π’Π°ΠΊΠΆΠ΅ достаточно просто Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ элСмСнт управлСния ActiveX Π² Ρ„ΠΎΡ€ΠΌΠ΅ Windows. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, сначала запустим Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Customize Toolbox ΠΈΠ· IDE VS.NET, Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π² ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов IDE ΠΈ Π²Ρ‹Π±Ρ€Π°Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΠ½ΠΊΡ‚ Π² контСкстном мСню. Когда появится Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ .NET Framework Components ΠΈ Π½Π°ΠΉΡ‚ΠΈ созданный ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ AxImp.exe Ρ„Π°ΠΉΠ» элСмСнта управлСния Windows. ПослС закрытия Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Customize Toolbox ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт управлСния появится Π² ΠΏΠ°Π½Π΅Π»ΠΈ управлСния IDE ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Windows Form Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты управлСния Windows.

ИспользованиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² .NET Π² COM

Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ COM ΠΈ элСмСнты управлСния ActiveX Π² ΠΊΠΎΠ΄Π΅ .NET, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ .NET Π² стандартном ΠΊΠΎΠ΄Π΅ Windows. Волько нСсколько свойств сборок .NET нСдоступны Ρ‡Π΅Ρ€Π΅Π· COM, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ конструкторы, статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ константныС поля. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, доступ ΠΊ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ .NET ΠΈΠ· COM Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

RegAsm.exe

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² COM Π² ΠΊΠΎΠ΄Π΅ .NET Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, которая сущСствуСт Π² SDK .NET, ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅. НазваниС этой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ β€” RegAsm.exe.

НазваниС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ RegAsm (Register Assembly) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° .NET Π² систСмный рССстр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ слуТбы COM ΠΌΠΎΠ³Π»ΠΈ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ. ПослС рСгистрации ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° .NET с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RegAsm, стандартныС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Windows ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ соСдинСниС с классами ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡ рСгистрации ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сдСлан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ПослС рСгистрации всС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ COM ΠΌΠΎΠ³ΡƒΡ‚ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. Он ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ классов .NET. Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ просто число Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» этого числа:

namespace Factorial {

 using System;


 public class Factorial {

  // Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ вычисляСт Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа

  public int ComputeFactorial(int n) {

   int intFactorial=n;

   for (int i = 1; i<n; i++) {

   intFactorial*=i;

  }

  return intFactorial;

 }

 }

}

ПослС компиляции класса ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² сборку .NET ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту сборку Π² слуТбах COM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RegAsm.exe:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° сборка зарСгистрирована Π² слуТбах COM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RegAsm, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС со сборкой .NET Ρ‡Π΅Ρ€Π΅Π· слуТбы COM. Π‘ Ρ†Π΅Π»ΡŒΡŽ дСмонстрации создадим простой сцСнарий VB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это Π΄Π΅Π»Π°Π΅Ρ‚. (Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ VB ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Notepad; Π²Π²Π΅Π΄ΠΈΡ‚Π΅ просто ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈ сохранитС Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .vbs. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ Windows Script Host установлСн, Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ сцСнарий. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ сцСнарий VB выполняСт ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² COM.)

Option Explicit

Dim objFactorial

Dim lngResult

Dim lngInputValue

Set objFactorial=CreateObject("Factorial.Factorial")

lngInputValue=InputBox("Numbers?")

IngResult=objFactorial.ComputeFactorial(CLng(lngInputValue))

Call MsgBox(lngResult)

Однако, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сборку Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ кэш. Для этого сначала создадим устойчивоС имя сборки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

sn -k Factorial.dll

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» AssemblyInfo.cs со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

using System.Reflection;

[assembly: AssemblyKeyFile("factorial.snk")]

Π—Π°Ρ‚Π΅ΠΌ это Π½Π°Π΄ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

CSC /t:module /out: AssemblyInfo.dll AssemblyInfo.cs

ПослС этого компилируСтся Ρ„Π°ΠΉΠ» Factorial.cs, ΠΈ получСнная DLL устанавливаСтся Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ кэш с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gacutil ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

csc /t:library /addmodule:assemblyinfΠΎ.dll Factorial.cs gacutil /i Factorial.dll

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ сцСнарий VB Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ слуТбами COM для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° .NET, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° .NET Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΠΊΠ½Π΅ сообщСния:


Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Π°Ρ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? Но ΠΎΠ½Π° Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· упомянутых Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с ΠΏΠΎΠ·Π΄Π½ΠΈΠΌ связываниСм. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‡Π»Π΅Π½ Π½Π°Π±ΠΎΡ€Π° инструмСнтов SDK .NET ΠΌΠΎΠΆΠ΅Ρ‚ Π² этом ΠΏΠΎΠΌΠΎΡ‡ΡŒ. Π­Ρ‚ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° TlbExp.exe.

Однако, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π°Ρ‚ΡŒΡΡ с TlbImp.exe, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ: слуТбы COM Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ сборки .NET, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ вызываСтся. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборка Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ Π² глобальном ΠΊΠΎΠ΄Π΅ сборки систСмы.

TlbExp.exe

TlbExp ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Type Library Exporter (экспортСр Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ²). ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π° Ρ„Π°ΠΉΠ»Π΅ сборки .NET TlbExp ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ манифСст этой сборки ΠΈ вывСсти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² COM (*.tlb). Когда TlbExp создаст Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° .NET, языки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ .NET, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ VB6, смогут ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эффСктивноС Ρ€Π°Π½Π½Π΅Π΅ связываниС с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ .NET: