Návod: Vložení typů ze spravovaných sestavení v sadě Visual Studio
Pokud vložíte informace o typu ze spravovaného sestavení se silným názvem, můžete v aplikaci volně párovat typy, abyste dosáhli nezávislosti verzí. To znamená, že váš program může být napsán tak, aby používal typy z libovolné verze spravované knihovny, aniž by se musel znovu kompilovat pro každou novou verzi.
Vkládání typů se často používá s interopem MODELU COM, jako je například aplikace, která používá objekty automatizace z Microsoft Office. Informace o typu vložení umožňují stejnému sestavení aplikace pracovat s různými verzemi Microsoft Office na různých počítačích. Můžete ale také použít vkládání typů s plně spravovanými řešeními.
Po zadání veřejných rozhraní, která mohou být vložena, vytvoříte třídy modulu runtime, které implementují tato rozhraní. Klientský program může vložit informace o typu rozhraní v době návrhu odkazováním na sestavení, které obsahuje veřejná rozhraní a nastavením Embed Interop Types
vlastnosti odkazu na True
. Klientský program pak může načíst instance objektů modulu runtime zadaných jako tato rozhraní. To je ekvivalent použití kompilátoru příkazového řádku a odkazování na sestavení pomocí možnosti EmbedInteropTypes kompilátoru.
Pokud vytvoříte novou verzi sestavení modulu runtime se silným názvem, klientský program není nutné znovu zkompilovat. Klientský program nadále používá jakoukoli verzi sestavení modulu runtime, která je pro něj k dispozici, pomocí informací o vložených typech pro veřejná rozhraní.
V tomto názorném postupu:
- Vytvořte sestavení se silným názvem s veřejným rozhraním obsahujícím informace o typu, které lze vložit.
- Vytvořte sestavení modulu runtime se silným názvem, které implementuje veřejné rozhraní.
- Vytvořte klientský program, který vloží informace o typu z veřejného rozhraní a vytvoří instanci třídy ze sestavení modulu runtime.
- Upravte a znovu vytvořte sestavení modulu runtime.
- Spusťte klientský program, abyste zjistili, že používá novou verzi sestavení modulu runtime, aniž by bylo nutné znovu zkompilovat.
Poznámka
Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí (IDE).
Podmínky a omezení
Informace o typu můžete vložit ze sestavení za následujících podmínek:
- Sestavení zveřejňuje alespoň jedno veřejné rozhraní.
- Vložená rozhraní jsou opatřena poznámkami s
ComImport
atributy aGuid
atributy s jedinečnými identifikátory GUID. - Sestavení je opatřeno poznámkami atributem
ImportedFromTypeLib
nebo atributemPrimaryInteropAssembly
a atributem na úrovniGuid
sestavení. Šablony projektů Visual C# a Visual Basic ve výchozím nastavení obsahují atribut na úrovniGuid
sestavení.
Vzhledem k tomu, že primární funkcí vkládání typu je podpora sestavení zprostředkovatele com, platí při vkládání informací o typu do plně spravovaného řešení následující omezení:
- Vloženy jsou pouze atributy specifické pro zprostředkovatele COM. Ostatní atributy jsou ignorovány.
- Pokud typ používá obecné parametry a typ obecného parametru je vložený typ, nelze tento typ použít přes hranice sestavení. Příklady překročení hranice sestavení zahrnují volání metody z jiného sestavení nebo odvození typu z typu definovaného v jiném sestavení.
- Konstanty nejsou vloženy.
- Třída System.Collections.Generic.Dictionary<TKey,TValue> nepodporuje vložený typ jako klíč. Můžete implementovat vlastní typ slovníku, který podporuje vložený typ jako klíč.
Vytvoření rozhraní
Prvním krokem je vytvoření sestavení rozhraní ekvivalence typů.
V sadě Visual Studio vyberte Soubor>nový>projekt.
V dialogovém okně Vytvořit nový projekt zadejte do pole Hledat šablonyknihovnu tříd. V seznamu vyberte šablonu C# nebo Visual Basic Class Library (.NET Framework) a pak vyberte Další.
V dialogovém okně Konfigurace nového projektu zadejte do pole Název projektutext TypeEquivalenceInterface a pak vyberte Vytvořit. Vytvoří se nový projekt.
V Průzkumník řešení klikněte pravým tlačítkem na soubor Class1.cs nebo Class1.vb, vyberte Přejmenovat a přejmenujte soubor z Class1 na ISampleInterface. Na výzvu k přejmenování třídy
ISampleInterface
na . Tato třída představuje veřejné rozhraní pro třídu.V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceInterface a pak vyberte Vlastnosti.
V levém podokně obrazovky Vlastnosti vyberte Sestavit a nastavte výstupní cestu na umístění v počítači, například C:\TypeEquivalenceSample. V tomto názorném postupu použijete stejné umístění.
V levém podokně obrazovky Vlastnosti vyberte Vytvořit>silné pojmenování a pak zaškrtněte políčko Podepsat sestavení. V souboru klíče silného názvu vyberte Procházet.
Přejděte na a vyberte soubor key.snk, který jste vytvořili v projektu TypeEquivalenceInterface , a pak vyberte OK. Další informace najdete v tématu Vytvoření páru veřejného a privátního klíče.
Otevřete soubor třídy ISampleInterface v editoru kódu a nahraďte jeho obsah následujícím kódem pro vytvoření
ISampleInterface
rozhraní:using System; using System.Runtime.InteropServices; namespace TypeEquivalenceInterface { [ComImport] [Guid("8DA56996-A151-4136-B474-32784559F6DF")] public interface ISampleInterface { void GetUserInput(); string UserInput { get; } } }
Imports System.Runtime.InteropServices <ComImport()> <Guid("8DA56996-A151-4136-B474-32784559F6DF")> Public Interface ISampleInterface Sub GetUserInput() ReadOnly Property UserInput As String End Interface
V nabídce Nástroje vyberte Vytvořit identifikátor GUID a v dialogovém okně Vytvořit identifikátor GUID vyberte Formát registru. Vyberte Kopírovat a pak vyberte Ukončit.
V atributu
Guid
kódu nahraďte ukázkový identifikátor GUID identifikátorem GUID, který jste zkopírovali, a odeberte složené závorky ({ }).V Průzkumník řešení rozbalte složku Vlastnosti a vyberte soubor AssemblyInfo.cs nebo AssemblyInfo.vb. V editoru kódu přidejte do souboru následující atribut:
[assembly: ImportedFromTypeLib("")]
<Assembly: ImportedFromTypeLib("")>
Vyberte Soubor>Uložit vše nebo stisknutím klávesy Ctrl+Shift+S uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceInterface a vyberte Sestavit. Soubor DLL knihovny tříd je zkompilován a uložen do zadané výstupní cesty sestavení, například C:\TypeEquivalenceSample.
Vytvoření třídy modulu runtime
Dále vytvořte třídu modulu runtime pro ekvivalenci typu.
V sadě Visual Studio vyberte Soubor>nový>projekt.
V dialogovém okně Vytvořit nový projekt zadejte do pole Hledat šablonyknihovnu tříd. V seznamu vyberte šablonu C# nebo Visual Basic Class Library (.NET Framework) a pak vyberte Další.
V dialogovém okně Konfigurovat nový projekt zadejte do pole Název projektuTypeEquivalenceRuntime a pak vyberte Vytvořit. Vytvoří se nový projekt.
V Průzkumník řešení klikněte pravým tlačítkem na soubor Class1.cs nebo Class1.vb, vyberte Přejmenovat a přejmenujte soubor z Třídy 1 na SampleClass. Na výzvu k přejmenování třídy
SampleClass
na . Tato třída implementujeISampleInterface
rozhraní.V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceInterface a vyberte Vlastnosti.
V levém podokně obrazovky Vlastnosti vyberte Sestavit a potom nastavte výstupní cestu na stejné místo, které jste použili pro projekt TypeEquivalenceInterface, například C:\TypeEquivalenceSample.
V levém podokně obrazovky Vlastnosti vyberte Vytvořit>silné pojmenování a pak zaškrtněte políčko Podepsat sestavení. V souboru klíče silného názvu vyberte Procházet.
Přejděte na a vyberte soubor key.snk, který jste vytvořili v projektu TypeEquivalenceInterface , a pak vyberte OK. Další informace najdete v tématu Vytvoření páru veřejného a privátního klíče.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceRuntime a vyberte Přidat>odkaz.
V dialogovém okně Správce odkazů vyberte Procházet a přejděte do složky výstupní cesty. Vyberte souborTypeEquivalenceInterface.dll , vyberte Přidat a pak vyberte OK.
V Průzkumník řešení rozbalte složku Reference a vyberte odkaz TypeEquivalenceInterface. V podokně Vlastnosti nastavte specifickou verzi na Hodnotu False , pokud ještě není.
Otevřete soubor třídy SampleClass v editoru kódu a nahraďte jeho obsah následujícím kódem pro vytvoření
SampleClass
třídy:using System; using TypeEquivalenceInterface; namespace TypeEquivalenceRuntime { public class SampleClass : ISampleInterface { private string p_UserInput; public string UserInput { get { return p_UserInput; } } public void GetUserInput() { Console.WriteLine("Please enter a value:"); p_UserInput = Console.ReadLine(); } } }
Imports TypeEquivalenceInterface Public Class SampleClass Implements ISampleInterface Private p_UserInput As String Public ReadOnly Property UserInput() As String Implements ISampleInterface.UserInput Get Return p_UserInput End Get End Property Public Sub GetUserInput() Implements ISampleInterface.GetUserInput Console.WriteLine("Please enter a value:") p_UserInput = Console.ReadLine() End Sub End Class
Vyberte Soubor>Uložit vše nebo stisknutím klávesy Ctrl+Shift+S uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceRuntime a vyberte Sestavit. Soubor dll knihovny tříd je zkompilován a uložen do zadané výstupní cesty sestavení.
Vytvoření klientského projektu
Nakonec vytvořte klientský program pro ekvivalenci typů, který odkazuje na sestavení rozhraní.
V sadě Visual Studio vyberte Soubor>nový>projekt.
V dialogovém okně Vytvořit nový projekt zadejte konzolu do pole Hledat šablony . V seznamu vyberte šablonu Konzolová aplikace jazyka C# nebo Visual Basic (.NET Framework) a pak vyberte Další.
V dialogovém okně Konfigurace nového projektu zadejte do pole Název projektuTypEquivalenceClient a pak vyberte Vytvořit. Vytvoří se nový projekt.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceClient a vyberte Vlastnosti.
V levém podokně obrazovky Vlastnosti vyberte Sestavit a potom nastavte výstupní cestu na stejné místo, které jste použili pro projekt TypeEquivalenceInterface, například C:\TypeEquivalenceSample.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceClient a vyberte Přidat>odkaz.
Pokud už je souborTypeEquivalenceInterface.dll v dialogovém okně Správce odkazů uvedený, vyberte ho. Pokud ne, vyberte Procházet, přejděte do složky výstupní cesty, vyberte souborTypeEquivalenceInterface.dll (ne TypeEquivalenceRuntime.dll) a vyberte Přidat. Vyberte OK.
V Průzkumník řešení rozbalte složku Reference a vyberte odkaz TypeEquivalenceInterface. V podokně Vlastnosti nastavte Vložit typy zprostředkovatele komunikace na Hodnotu True.
Otevřete soubor Program.cs nebo Module1.vb v editoru kódu a nahraďte jeho obsah následujícím kódem pro vytvoření klientského programu:
using System; using System.Reflection; using TypeEquivalenceInterface; namespace TypeEquivalenceClient { class Program { static void Main(string[] args) { Assembly sampleAssembly = Assembly.Load("TypeEquivalenceRuntime"); ISampleInterface sampleClass = (ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass"); sampleClass.GetUserInput(); Console.WriteLine(sampleClass.UserInput); Console.WriteLine(sampleAssembly.GetName().Version.ToString()); Console.ReadLine(); } } }
Imports System.Reflection Imports TypeEquivalenceInterface Module Module1 Sub Main() Dim sampleAssembly = Assembly.Load("TypeEquivalenceRuntime") Dim sampleClass As ISampleInterface = CType( _ sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass"), ISampleInterface) sampleClass.GetUserInput() Console.WriteLine(sampleClass.UserInput) Console.WriteLine(sampleAssembly.GetName().Version) Console.ReadLine() End Sub End Module
Vyberte Soubor>Uložit vše nebo stisknutím klávesy Ctrl+Shift+S uložte soubory a projekt.
Stisknutím kláves Ctrl+F5 sestavte a spusťte program. Všimněte si, že výstup konzoly vrátí verzi sestavení 1.0.0.0.
Úprava rozhraní
Nyní upravte sestavení rozhraní a změňte jeho verzi.
V sadě Visual Studio vyberte Soubor>Otevřít>projekt/řešení a otevřete projekt TypeEquivalenceInterface .
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceInterface a vyberte Vlastnosti.
V levém podokně obrazovky Vlastnosti vyberte Aplikace a pak vyberte Informace o sestavení.
V dialogovém okně Informace o sestavení změňte hodnoty Assembly version (Verze sestavení ) a File version (Verze souboru ) na 2.0.0.0 a pak vyberte OK.
Otevřete soubor SampleInterface.cs nebo SampleInterface.vb a přidejte do
ISampleInterface
rozhraní následující řádek kódu:DateTime GetDate();
Function GetDate() As Date
Vyberte Soubor>Uložit vše nebo stisknutím klávesy Ctrl+Shift+S uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceInterface a vyberte Sestavit. Je zkompilována nová verze souboru DLL knihovny tříd a uložena do výstupní cesty sestavení.
Úprava třídy modulu runtime
Upravte také třídu modulu runtime a aktualizujte její verzi.
V sadě Visual Studio vyberte Soubor>Otevřít>projekt nebo řešení a otevřete projekt TypeEquivalenceRuntime .
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceRuntime a vyberte Vlastnosti.
V levém podokně obrazovky Vlastnosti vyberte Aplikace a pak vyberte Informace o sestavení.
V dialogovém okně Informace o sestavení změňte hodnoty Assembly version (Verze sestavení ) a File version (Verze souboru ) na 2.0.0.0 a pak vyberte OK.
Otevřete soubor SampleClass.cs nebo SampleClass.vb a přidejte do
SampleClass
třídy následující kód:public DateTime GetDate() { return DateTime.Now; }
Public Function GetDate() As DateTime Implements ISampleInterface.GetDate Return Now End Function
Vyberte Soubor>Uložit vše nebo stisknutím klávesy Ctrl+Shift+S uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem na projekt TypeEquivalenceRuntime a vyberte Sestavit. Je zkompilována nová verze souboru DLL knihovny tříd a uložena do výstupní cesty sestavení.
Spuštění aktualizovaného klientského programu
Přejděte do umístění výstupní složky sestavení a spusťte TypeEquivalenceClient.exe. Všimněte si, že výstup konzoly nyní odráží novou verzi TypeEquivalenceRuntime
sestavení 2.0.0.0, aniž by byl program překompilován.