Bagikan melalui


Panduan: Menyematkan jenis dari assembly terkelola di Visual Studio

Jika Anda menyematkan informasi jenis dari assembly terkelola dengan nama yang kuat, Anda dapat secara longgar beberapa jenis dalam aplikasi untuk mencapai kemandirian versi. Artinya, program Anda dapat ditulis untuk menggunakan jenis dari versi pustaka terkelola apa pun tanpa harus dikommpilasikan ulang untuk setiap versi baru.

Penyematan jenis sering digunakan dengan interop COM, seperti aplikasi yang menggunakan objek otomatisasi dari Microsoft Office. Informasi jenis penyematan memungkinkan build program yang sama untuk bekerja dengan versi Microsoft Office yang berbeda di komputer yang berbeda. Namun, Anda juga dapat menggunakan penyematan jenis dengan solusi yang dikelola sepenuhnya.

Setelah Anda menentukan antarmuka publik yang dapat disematkan, Anda membuat kelas runtime yang mengimplementasikan antarmuka tersebut. Program klien dapat menyematkan informasi jenis untuk antarmuka pada waktu desain dengan merujuk assembly yang berisi antarmuka publik dan mengatur Embed Interop Types properti referensi ke True. Program klien kemudian dapat memuat instans objek runtime yang diketik sebagai antarmuka tersebut. Ini setara dengan menggunakan pengompilasi baris perintah dan merujuk assembly dengan menggunakan opsi pengompilasi EmbedInteropTypes.

Jika Anda membuat versi baru dari assembly runtime dengan nama yang kuat, program klien tidak harus dikombinasikan ulang. Program klien terus menggunakan versi assembly runtime mana pun yang tersedia untuknya, menggunakan informasi jenis yang disematkan untuk antarmuka publik.

Dalam panduan ini, Anda akan:

  1. Buat assembly dengan nama yang kuat dengan antarmuka publik yang berisi informasi jenis yang dapat disematkan.
  2. Buat assembly runtime dengan nama yang kuat yang mengimplementasikan antarmuka publik.
  3. Buat program klien yang menyematkan informasi jenis dari antarmuka publik dan membuat instans kelas dari assembly runtime.
  4. Ubah dan bangun kembali assembly runtime.
  5. Jalankan program klien untuk melihat bahwa ini menggunakan versi baru assembly runtime tanpa harus dikompilasikan ulang.

Catatan

Komputer Anda mungkin memperlihatkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam petunjuk berikut. Edisi Visual Studio yang Anda miliki dan setelan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi selengkapnya, lihat Mempersonalisasi IDE.

Ketentuan dan batasan

Anda bisa menyematkan informasi jenis dari assembly dalam kondisi berikut:

  • Assembly mengekspos setidaknya satu antarmuka publik.
  • Antarmuka yang disematkan diannotasikan dengan ComImport atribut dan Guid atribut dengan GUID unik.
  • Assembly diannotasikan dengan atribut ImportedFromTypeLib atau atribut PrimaryInteropAssembly, dan atribut tingkat assembly Guid. Templat proyek Visual C# dan Visual Basic menyertakan atribut tingkat assembly Guid secara default.

Karena fungsi utama penyematan jenis adalah mendukung assembly interop COM, batasan berikut berlaku saat Anda menyematkan informasi jenis dalam solusi yang dikelola sepenuhnya:

  • Hanya atribut khusus untuk interop COM yang disematkan. Atribut lain diabaikan.
  • Jika jenis menggunakan parameter generik, dan jenis parameter generik adalah jenis yang disematkan, jenis tersebut tidak dapat digunakan di seluruh batas assembly. Contoh persimpangan batas assembly termasuk memanggil metode dari assembly lain atau mengambil jenis dari jenis yang ditentukan dalam assembly lain.
  • Konstanta tidak disematkan.
  • Kelas System.Collections.Generic.Dictionary<TKey,TValue> tidak mendukung jenis yang disematkan sebagai kunci. Anda dapat menerapkan jenis kamus Anda sendiri untuk mendukung jenis yang disematkan sebagai kunci.

Membuat antarmuka

Langkah pertama adalah membuat assembly antarmuka kesetaraan jenis.

  1. Di Visual Studio, pilih File>Baru>Proyek.

  2. Dalam kotak dialog Buat proyek baru, ketik pustaka kelas di kotak Cari templat. Pilih templat C# atau Pustaka Kelas Visual Basic (Kerangka Kerja .NET) dari daftar, lalu pilih Berikutnya.

  3. Dalam kotak dialog Konfigurasikan proyek baru Anda, di bawah nama Proyek, ketik TypeEquivalenceInterface, lalu pilih Buat. Proyek baru telah dibuat.

  4. Di Penjelajah Solusi, klik kanan file Class1.cs atau Class1.vb, pilih Ganti Nama, dan ganti nama file dari Class1 menjadi ISampleInterface. Tanggapi Ya untuk permintaan untuk mengganti nama kelas menjadi ISampleInterface. Kelas ini mewakili antarmuka publik untuk kelas.

  5. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceInterface dan pilih Properti.

  6. Pilih Build di panel kiri layar Properti, dan atur jalur Output ke lokasi di komputer Anda, seperti C:\TypeEquivalenceSample. Anda menggunakan lokasi yang sama di seluruh panduan ini.

  7. Pilih Buat>penamaan Kuat di panel kiri layar Properti , lalu pilih kotak centang Tanda tangani perakitan . Di file Kunci nama yang kuat, pilih Telusuri.

  8. Navigasi ke dan pilih file key.snk yang Anda buat di proyek TypeEquivalenceInterface , lalu pilih OK. Untuk informasi selengkapnya, lihat Membuat pasangan kunci publik-privat.

  9. Buka file kelas ISampleInterface di editor kode, dan ganti kontennya dengan kode berikut untuk membuat antarmuka ISampleInterface:

    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
    
  10. Pada menu Alat, pilih Buat Guid, dan dalam kotak dialog Buat GUID, pilih Format Registri. Pilih Salin, lalu pilih Keluar.

  11. Di atribut kode Guid Anda, ganti contoh GUID dengan GUID yang Anda salin, dan hapus kurung kurawal ({ }).

  12. Di Penjelajah Solusi, perluas folder Properti dan pilih file AssemblyInfo.cs atau AssemblyInfo.vb. Di editor kode, tambahkan atribut berikut ke file:

    [assembly: ImportedFromTypeLib("")]
    
    <Assembly: ImportedFromTypeLib("")>
    
  13. Pilih File>Simpan Semua atau tekan Ctrl+Shift+S untuk menyimpan proyek.

  14. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceInterface dan pilih Build. File DLL pustaka kelas dikompilasi dan disimpan ke jalur output build yang ditentukan, misalnya C:\TypeEquivalenceSample.

Membuat kelas runtime

Selanjutnya, buat kelas runtime setara jenis.

  1. Di Visual Studio, pilih File>Baru>Proyek.

  2. Dalam kotak dialog Buat proyek baru, ketik pustaka kelas di kotak Cari templat. Pilih templat C# atau Pustaka Kelas Visual Basic (Kerangka Kerja .NET) dari daftar, lalu pilih Berikutnya.

  3. Dalam kotak dialog Konfigurasikan proyek baru Anda, di bawah nama Proyek, ketik TypeEquivalenceInterface, lalu pilih Buat. Proyek baru telah dibuat.

  4. Di Penjelajah Solusi, klik kanan file Class1.cs atau Class1.vb, pilih Ganti Nama, dan ganti nama file dari Class1 menjadi SampleClass. Tanggapi Ya untuk permintaan untuk mengganti nama kelas menjadi SampleClass. Kelas ini menerapkan antarmuka ISampleInterface.

  5. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceInterface dan pilih Properti.

  6. Pilih Bangun di panel kiri layar Properti , lalu atur jalur Output ke lokasi yang sama dengan yang Anda gunakan untuk proyek TypeEquivalenceInterface , misalnya, C:\TypeEquivalenceSample.

  7. Pilih Buat>penamaan Kuat di panel kiri layar Properti , lalu pilih kotak centang Tanda tangani perakitan . Di file Kunci nama yang kuat, pilih Telusuri.

  8. Navigasi ke dan pilih file key.snk yang Anda buat di proyek TypeEquivalenceInterface , lalu pilih OK. Untuk informasi selengkapnya, lihat Membuat pasangan kunci publik-privat.

  9. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceRuntime dan pilih Tambah>Referensi.

  10. Dalam dialog Manajer Referensi, pilih Telusuri dan telusuri ke folder jalur output. Pilih file TypeEquivalenceInterface.dll , pilih Tambahkan, lalu pilih OK.

  11. Di Penjelajah Solusi, perluas folder Referensi dan pilih referensi TypeEquivalenceInterface. Di panel Properti, atur Versi Tertentu ke Salah jika belum.

  12. Buka file kelas SampleClass di editor kode, dan ganti kontennya dengan kode berikut untuk membuat antarmuka SampleClass:

    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
    
  13. Pilih File>Simpan Semua atau tekan Ctrl+Shift+S untuk menyimpan proyek.

  14. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceRuntime dan pilih Build. Versi baru file DLL pustaka kelas dikompilasi dan disimpan ke jalur output build yang ditentukan.

Membuat proyek klien

Terakhir, buat program klien setara jenis yang mereferensikan perakitan antarmuka.

  1. Di Visual Studio, pilih File>Baru>Proyek.

  2. Dalam kotak dialog Buat proyek baru, ketik pustaka kelas di kotak Cari templat. Pilih templat C# atau Pustaka Kelas Visual Basic (Kerangka Kerja .NET) dari daftar, lalu pilih Berikutnya.

  3. In the Configure your new project dialog box, under Project name, type TypeEquivalenceClient, and then select Create. Proyek baru telah dibuat.

  4. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceClient dan pilih Properti.

  5. Pilih Build di panel kiri layar Properti, lalu atur jalur Output ke lokasi yang sama dengan yang Anda gunakan untuk proyek TypeEquivalenceInterface, misalnya, C:\TypeEquivalenceSample.

  6. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceClient dan pilih Tambah>Referensi.

  7. Dalam dialog Manajer Referensi, jika file TypeEquivalenceInterface.dll sudah tercantum, pilih file tersebut. Jika tidak, pilih Telusuri, telusuri ke folder jalur output, pilih file TypeEquivalenceInterface.dll (bukan TypeEquivalenceRuntime.dll), dan pilih Tambahkan. PilihOK.

  8. Di Penjelajah Solusi, perluas folder Referensi dan pilih referensi TypeEquivalenceInterface. Di panel Properti, atur Sematkan Jenis Interop ke True.

  9. Buka file Program.cs atau Module1.vb di editor kode, dan ganti kontennya dengan kode berikut untuk membuat program klien:

    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
    
  10. Pilih File>Simpan Semua atau tekan Ctrl+Shift+S untuk menyimpan proyek.

  11. Tekan CtrlF5 atau +CtrlF5 untuk membangun dan menjalankan proyek. Perhatikan bahwa output konsol mengembalikan assembly versi 1.0.0.0.

Memodifikasi antarmuka

Sekarang, ubah Assembly antarmuka, dan ubah versinya.

  1. Di Visual Studio, pilih File>Buka>Project/Solution, dan buka proyek TypeEquivalenceInterface.

  2. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceInterface dan pilih Properti.

  3. Pilih Aplikasi di panel kiri layar Properti, lalu pilih Informasi Assembly.

  4. Dalam kotak dialog Informasi Assembly, ubah versi Assembly dan Nilai versi file menjadi 2.0.0.0, lalu pilih OK.

  5. Buka file SampleInterface.cs atau SampleInterface.vb, dan tambahkan baris kode berikut ke antarmuka ISampleInterface:

    DateTime GetDate();
    
    Function GetDate() As Date
    
  6. Pilih File>Simpan Semua atau tekan Ctrl+Shift+S untuk menyimpan proyek.

  7. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceInterface dan pilih Build. Versi baru file DLL pustaka kelas dikompilasi dan disimpan ke jalur output build.

Memodifikasi kelas runtime bahasa umum

Modifikasi juga kelas runtime bahasa umum dan perbarui versinya.

  1. Di Visual Studio, pilih File>Buka>Project/Solution, dan buka proyek TypeEquivalenceRuntime.

  2. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceRuntime dan pilih Properti.

  3. Pilih Aplikasi di panel kiri layar Properti, lalu pilih Informasi Assembly.

  4. Dalam kotak dialog Informasi Assembly, ubah versi Assembly dan Nilai versi file menjadi 2.0.0.0, lalu pilih OK.

  5. Buka SampleClass.cs atau file SampleClass.vb, dan tambahkan kode berikut ke kelas SampleClass:

     public DateTime GetDate()
     {
         return DateTime.Now;
     }
    
    Public Function GetDate() As DateTime Implements ISampleInterface.GetDate
        Return Now
    End Function
    
  6. Pilih File>Simpan Semua atau tekan Ctrl+Shift+S untuk menyimpan proyek.

  7. Di Penjelajah Solusi, klik kanan proyek TypeEquivalenceRuntime dan pilih Build. Versi baru file DLL pustaka kelas dikompilasi dan disimpan ke jalur output build.

Jalankan program klien yang diperbarui

Buka lokasi folder output build dan jalankan TypeEquivalenceClient.exe. Perhatikan bahwa output konsol sekarang mencerminkan versi baru assembly TypeEquivalenceRuntime, 2.0.0.0, tanpa program dikompresi ulang.

Lihat juga