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 volně kombinovat typy v aplikaci, aby se dosáhlo nezávislosti verzí. To znamená, že program může být napsán tak, aby používal typy z jakékoli verze spravované knihovny, aniž by bylo nutné znovu kompilovat pro každou novou verzi.
Vkládání typů se často používá u zprostředkovatele komunikace s objekty COM, jako je například aplikace, která používá automatizační objekty z Microsoft Office. vložení informací o typu umožňuje stejné sestavení programu pracovat s různými verzemi Microsoft Office v 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 pro rozhraní v době návrhu, a to tak, že odkazuje na sestavení, které obsahuje veřejná rozhraní a nastavuje Embed Interop Types vlastnost odkazu na True . Klientský program pak může načíst instance objektů za běhu, které jsou zadány jako tato rozhraní. To je ekvivalentní použití kompilátoru příkazového řádku a odkazování na sestavení pomocí Možnosti kompilátoru EmbedInteropTypes.
Vytvoříte-li novou verzi sestavení modulu runtime se silným názvem, klientský program nebude nutné znovu kompilovat. Klientský program nadále používá, je-li k dispozici verze sestavení modulu runtime, používá informace vloženého typu pro veřejná rozhraní.
V tomto návodu:
- Vytvořte sestavení se silným názvem pomocí veřejného rozhraní obsahujícího informace o typu, které mohou být vloženy.
- 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 sestavte sestavení modulu runtime.
- Spusťte klientský program, aby bylo vidět, že používá novou verzi sestavení modulu runtime, aniž by bylo nutné znovu kompilovat.
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í
Můžete vložit informace o typu ze sestavení za následujících podmínek:
- Sestavení zveřejňuje alespoň jedno veřejné rozhraní.
- Vložená rozhraní jsou opatřena
ComImportatributy a atributyGuids jedinečnými identifikátory GUID. - Sestavení je opatřeno poznámkou s atributem nebo atributem
ImportedFromTypeLibPrimaryInteropAssemblya atributem na úrovni sestaveníGuid. šablony projektů Visual C# a Visual BasicGuidve výchozím nastavení zahrnují atribut na úrovni sestavení.
Vzhledem k tomu, že primární funkce vkládání typů je podpora sestavení COM interop, platí při vložení informací o typu do plně spravovaného řešení následující omezení:
- Jsou vložené pouze atributy specifické pro zprostředkovatele komunikace s objekty COM. Ostatní atributy se ignorují.
- Pokud typ používá obecné parametry a typ obecného parametru je vložený typ, tento typ nelze použít napříč hranicí sestavení. Příklady kříž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.
- System.Collections.Generic.Dictionary<TKey,TValue>Třída nepodporuje vložený typ jako klíč. Můžete implementovat vlastní typ slovníku pro podporu vloženého typu jako klíče.
Vytvoření rozhraní
Prvním krokem je vytvoření sestavení rozhraní rovnocennosti typů.
v Visual Studio vyberte soubor > nový > Project.
V dialogovém okně vytvořit nový projekt zadejte do pole Hledat šablony knihovnu tříd . v seznamu vyberte šablonu knihovna tříd (.NET Framework) C# nebo Visual Basic a pak vyberte další.
v dialogovém okně konfigurovat nový projekt zadejte do pole Project název text TypeEquivalenceInterface a pak vyberte vytvořit. Vytvoří se nový projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na soubor Class1. cs nebo Class1. vb , vyberte Přejmenovat a přejmenujte soubor z Class1 na ISampleInterface. Chcete-li také přejmenovat třídu na, odpovězte na výzvu Ano
ISampleInterface. Tato třída reprezentuje veřejné rozhraní třídy.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 sestavovat a nastavte výstupní cestu k umístění v počítači, například C:\TypeEquivalenceSample. V rámci tohoto Názorného postupu použijete stejné umístění.
V levém podokně obrazovky vlastnosti vyberte podepisování a zaškrtněte políčko podepsat sestavení . V rozevíracím seznamu pro Výběr souboru klíče se silným názvem vyberte možnost Nový.
V dialogovém okně vytvořit klíč se silným názvem zadejte do pole název souboru klíče Key. snk. Zrušte zaškrtnutí políčka chránit soubor klíče heslem a pak vyberte OK.
V editoru kódu otevřete soubor třídy ISampleInterface a nahraďte jeho obsah následujícím kódem pro vytvoření
ISampleInterfacerozhraní: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 InterfaceV nabídce nástroje vyberte možnost vytvořit GUID a v dialogovém okně vytvořit identifikátor GUID vyberte Formát registru. Vyberte možnost Kopírovat a pak vyberte možnost ukončit.
V
Guidatributu kódu nahraďte vzorový 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 Properties (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 stiskněte klávesovou zkratku CTRL + + SHIFT + s a uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceInterface a vyberte možnost sestavit. Soubor DLL knihovny tříd je zkompilován a uložen do zadané výstupní cesty sestavení, například C:\TypeEquivalenceSample.
Vytvoření běhové třídy
Dále vytvořte třídu prostředí runtime ekvivalenci typu.
v Visual Studio vyberte soubor > nový > Project.
V dialogovém okně vytvořit nový projekt zadejte do pole Hledat šablony knihovnu tříd . v seznamu vyberte šablonu knihovna tříd (.NET Framework) C# nebo Visual Basic a pak vyberte další.
v dialogovém okně konfigurovat nový projekt zadejte do pole Project název text TypeEquivalenceRuntime a pak vyberte vytvořit. Vytvoří se nový projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na soubor Class1. cs nebo Class1. vb , vyberte Přejmenovat a přejmenujte soubor z Class1 na SampleClass. Chcete-li také přejmenovat třídu na, odpovězte na výzvu Ano
SampleClass. Tato třída implementujeISampleInterfacerozhraní.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 pak nastavte výstupní cestu ke stejnému umístění, které jste použili pro projekt TypeEquivalenceInterface, například C:\TypeEquivalenceSample.
V levém podokně obrazovky vlastnosti vyberte podepisování a zaškrtněte políčko podepsat sestavení . V rozevíracím seznamu pro Výběr souboru klíče se silným názvem vyberte možnost Nový.
V dialogovém okně vytvořit klíč se silným názvem zadejte do pole název souboru klíče Key. snk. Zrušte zaškrtnutí políčka chránit soubor klíče heslem a pak vyberte OK.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceRuntime a vyberte možnost Přidat > odkaz.
V dialogovém okně Správce odkazů vyberte Procházet a přejděte do složky výstupní cesta. Vyberte soubor TypeEquivalenceInterface.dll , vyberte Přidat a pak vyberte OK.
V Průzkumník řešení rozbalte složku odkazy a vyberte odkaz TypeEquivalenceInterface . V podokně vlastnosti nastavte konkrétní verzi na hodnotu NEPRAVDA , pokud ještě není.
V editoru kódu otevřete soubor třídy SampleClass a nahraďte jeho obsah následujícím kódem pro vytvoření
SampleClasstří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 ClassVyberte soubor > Uložit vše nebo stiskněte klávesovou zkratku CTRL + + SHIFT + s a uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceRuntime a vyberte možnost sestavit. Soubor DLL knihovny tříd je zkompilován a uložen do zadané výstupní cesty sestavení.
Vytvořit klientský projekt
Nakonec vytvořte rovnocenný typ klientského programu, který odkazuje na sestavení rozhraní.
v Visual Studio vyberte soubor > nový > Project.
V dialogovém okně vytvořit nový projekt zadejte do pole Hledat šablony text Konzola . v seznamu vyberte šablonu aplikace konzoly C# nebo Visual Basic (.NET Framework) a pak vyberte další.
v dialogovém okně konfigurovat nový projekt zadejte do pole Project název text TypeEquivalenceClient 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 pak nastavte výstupní cestu ke stejnému umístění, které jste použili pro projekt TypeEquivalenceInterface, například C:\TypeEquivalenceSample.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceClient a vyberte možnost Přidat > odkaz.
Pokud je v dialogovém okně Správce odkazů již soubor TypeEquivalenceInterface.dll uveden, vyberte jej. Pokud ne, vyberte Procházet, přejděte do složky výstupní cesta, vyberte soubor TypeEquivalenceInterface.dll (ne TypeEquivalenceRuntime.dll) a vyberte Přidat. Vyberte OK.
V Průzkumník řešení rozbalte složku odkazy a vyberte odkaz TypeEquivalenceInterface . V podokně Vlastnosti nastavte možnosti Vložit typy spolupráce 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 ModuleVyberte soubor > Uložit vše nebo stiskněte klávesovou zkratku CTRL + + SHIFT + s a uložte soubory a projekt.
Stisknutím klávesy CTRL + F5 Sestavte a spusťte program. Všimněte si, že výstup konzoly vrátí sestavení verze 1.0.0.0.
Změna rozhraní
Nyní upravte sestavení rozhraní a změňte jeho verzi.
v Visual Studio vyberte soubor > otevřít > Project/Solution 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 verzi sestavení a hodnoty verze souboru na 2.0.0.0 a pak vyberte OK.
Otevřete soubor SampleInterface. cs nebo SampleInterface. vb a přidejte následující řádek kódu do
ISampleInterfacerozhraní:DateTime GetDate();Function GetDate() As DateVyberte soubor > Uložit vše nebo stiskněte klávesovou zkratku CTRL + + SHIFT + s a uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceInterface a vyberte možnost sestavit. Nová verze souboru DLL knihovny tříd je zkompilována a uložena do výstupní cesty sestavení.
Úprava běhové třídy
Také upravte třídu modulu runtime a aktualizujte její verzi.
v Visual Studio vyberte soubor > otevřít > Project/Solution 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 verzi sestavení a hodnoty verze souboru na 2.0.0.0 a pak vyberte OK.
Otevřete soubor SampleClass. cs nebo SampleClass. vb a do třídy přidejte následující kód
SampleClass:public DateTime GetDate() { return DateTime.Now; }Public Function GetDate() As DateTime Implements ISampleInterface.GetDate Return Now End FunctionVyberte soubor > Uložit vše nebo stiskněte klávesovou zkratku CTRL + + SHIFT + s a uložte soubory a projekt.
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt TypeEquivalenceRuntime a vyberte možnost sestavit. Nová verze souboru DLL knihovny tříd je zkompilována a uložena do výstupní cesty sestavení.
Spustit aktualizovaný klientský program
Přejít do umístění výstupní složky sestavení a spustit TypeEquivalenceClient.exe. Všimněte si, že výstup konzoly nyní odráží novou verzi TypeEquivalenceRuntime sestavení 2.0.0.0, aniž by byl program znovu zkompilován.