C# Opsi Kompiler yang menentukan input

Opsi berikut mengontrol input kompiler. Sintaksis MSBuild baru ditampilkan dalam Huruf tebal. Sintaks csc.exe yang lebih lama ditampilkan dalam huruf code style.

  • Referensi / -reference atau -references : Referensi metadata dari file atau file rakitan yang ditentukan.
  • AddModules / -addmodule: Tambahkan modul (dibuat dengan target:module ke assembly ini.)
  • EmbedInteropTypes / -link: Sematkan metadata dari file rakitan interop yang ditentukan.

Referensi

Opsi Referensi menyebabkan pengkompilasi mengimpor informasi jenis publik dalam file yang ditentukan ke dalam proyek saat ini, memungkinkan Anda mereferensikan metadata dari file rakitan yang ditentukan.

<Reference Include="filename" />

filename adalah nama file yang berisi manifes perakitan. Untuk mengimpor lebih dari satu file, sertakan elemen Referensi terpisah untuk setiap file. Anda dapat menentukan alias sebagai elemen turunan dari elemen Referensi :

<Reference Include="filename.dll">
  <Aliases>LS</Aliases>
</Reference>

Dalam contoh sebelumnya, LS adalah pengidentifikasi C# yang valid yang mewakili namespace layanan akar yang akan berisi semua namespace dalam perakitanfilename.dll. File yang Anda impor harus berisi manifes. Gunakan AdditionalLibPaths untuk menentukan direktori tempat satu atau beberapa referensi Majelis Anda berada. Topik AdditionalLibPaths juga membahas direktori tempat pengkompilasi mencari rakitan. Agar kompiler mengenali jenis dalam perakitan, dan bukan dalam modul, perlu dipaksa untuk menyelesaikan jenis, yang dapat Anda lakukan dengan menentukan instance dari jenis tersebut. Ada cara lain untuk menyelesaikan nama tipe dalam perakitan untuk kompiler: misalnya, jika Anda mewarisi dari jenis dalam perakitan, nama tipe kemudian akan dikenali oleh kompiler. Terkadang perlu untuk mereferensikan dua versi berbeda dari komponen yang sama dari dalam satu perakitan. Untuk melakukan ini, gunakan elemen Alias pada elemen Referensi untuk setiap file untuk membedakan antara dua file. Alias ini akan digunakan sebagai kualifikasi untuk nama komponen, dan akan menyelesaikan ke komponen di salah satu file.

Catatan

Di Visual Studio, gunakan perintah Tambahkan Referensi. Untuk informasi selengkapnya, lihat Cara: Menambahkan atau Menghapus Referensi Dengan Menggunakan Kotak Dialog Tambahkan Referensi.

AddModules

Opsi ini menambahkan modul yang dibuat dengan <TargetType>module</TargetType> sakelar ke kompilasi saat ini:

<AddModule Include=file1 />
<AddModule Include=file2 />

Di mana file, file2 adalah file output yang berisi metadata. Berkas tidak dapat berisi manifes perakitan. Untuk mengimpor lebih dari satu file, pisahkan nama file dengan koma atau titik koma. Semua modul yang ditambahkan dengan AddModules harus berada di direktori yang sama dengan file output saat dijalankan. Artinya, Anda dapat menentukan modul di direktori apa pun pada waktu kompilasi, tetapi modul harus berada di direktori aplikasi pada durasi. Jika modul tidak berada di direktori aplikasi pada durasi, Anda akan mendapatkan TypeLoadException. file tidak dapat berisi assembly. Misalnya, jika file output dibuat dengan opsi TargetTypemodul, metadatanya dapat diimpor dengan AddModules.

Jika file output dibuat dengan opsi TargetType selain modul, metadatanya tidak dapat diimpor dengan AddModules tetapi dapat diimpor dengan opsi Referensi.

EmbedInteropTypes

Menyebabkan pengkompilasi membuat informasi jenis COM dalam rakitan yang ditentukan tersedia untuk proyek yang saat ini Anda kompilasikan.

<References>
  <EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>

Di mana file1;file2;file3 adalah daftar nama file rakitan yang dibatasi titik koma. Jika nama file memiliki spasi, sertakan nama dalam tanda kutip (" "). Opsi EmbedInteropTypes memungkinkan Anda untuk menyebarkan aplikasi yang memiliki informasi jenis yang disematkan. Aplikasi kemudian dapat menggunakan jenis dalam rakitan runtime yang mengimplementasikan informasi jenis yang disematkan tanpa memerlukan referensi ke perakitan runtime. Jika berbagai versi rakitan runtime diterbitkan, aplikasi yang berisi informasi jenis yang disematkan dapat bekerja dengan berbagai versi tanpa harus dikompilasi ulang. Misanya, lihat Panduan: Menyematkan Jenis dari Rakitan Terkelola.

Menggunakan opsi EmbedInteropTypes sangat berguna saat Anda bekerja dengan COM interop. Anda dapat menyematkan jenis COM sehingga aplikasi Anda tidak lagi memerlukan perakitan interop utama (PIA) pada komputer target. Opsi EmbedInteropTypes menginstruksikan kompiler untuk menyematkan informasi jenis COM dari rakitan interop yang direferensikan ke dalam kode kompilasi yang dihasilkan. Jenis COM diidentifikasi oleh nilai CLSID (GUID). Akibatnya, aplikasi Anda dapat berjalan pada komputer target yang telah menginstal jenis COM yang sama dengan nilai CLSID yang sama. Aplikasi yang mengotomatiskan Microsoft Office adalah contoh yang baik. Karena aplikasi seperti Office biasanya menyimpan nilai CLSID yang sama di berbagai versi, aplikasi Anda dapat menggunakan jenis COM yang direferensikan selama .NET Framework 4 atau yang lebih baru diinstal pada komputer target dan aplikasi Anda menggunakan metode, properti, atau peristiwa yang disertakan dalam jenis COM yang direferensikan. Opsi EmbedInteropTypes hanya menyematkan antarmuka, struktur, dan delegasi. Menyematkan kelas COM tidak didukung.

Catatan

Saat Anda membuat instans jenis COM yang disematkan dalam kode, Anda harus membuat instans tersebut dengan menggunakan antarmuka yang sesuai. Mencoba membuat instans jenis COM yang disematkan dengan menggunakan CoClass menyebabkan kesalahan.

Seperti opsi kompiler Referensi, opsi kompiler EmbedInteropTypes menggunakan file respons Csc.rsp, yang merujuk rakitan .NET yang sering digunakan. Gunakan opsi compiler NoConfig jika Anda tidak ingin compiler menggunakan file Csc.rsp.

// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;

Jenis yang memiliki parameter generik yang jenisnya disematkan dari rakitan interop tidak dapat digunakan jika jenis tersebut berasal dari rakitan eksternal. Pembatasan ini tidak berlaku untuk antarmuka. Misalnya, pertimbangkan antarmuka Range yang ditetapkan dalam rakitan Microsoft.Office.Interop.Excel. Jika pustaka menyematkan jenis interop dari rakitan Microsoft.Office.Interop.Excel dan mengekspos metode yang mengembalikan jenis generik yang memiliki parameter yang jenisnya adalah antarmuka Range, metode tersebut harus mengembalikan antarmuka generik, seperti yang ditunjukkan dalam contoh kode berikut.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;

public class Utility
{
    // The following code causes an error when called by a client assembly.
    public List<Range> GetRange1()
    {
        return null;
    }

    // The following code is valid for calls from a client assembly.
    public IList<Range> GetRange2()
    {
        return null;
    }
}

Dalam contoh berikut, kode klien dapat memanggil metode yang mengembalikan antarmuka generik IList tanpa kesalahan.

public class Client
{
    public void Main()
    {
        Utility util = new Utility();

        // The following code causes an error.
        List<Range> rangeList1 = util.GetRange1();

        // The following code is valid.
        List<Range> rangeList2 = (List<Range>)util.GetRange2();
    }
}