it-swarm-id.com

Seret dan lepas a DLL ke GAC ("Majelis") di windows server 2008 .net 4.0

Saya sudah mencoba untuk menyebarkan beberapa kode ke mesin klien, di mana saya tidak ingin menginstal alat MS windows SDK. Ini berarti tidak memiliki akses ke "gacutil". Saya juga belum membuat installer untuk kode saya. Tampaknya ini mungkin satu-satunya dua opsi di .net 4.0.

Di masa lalu saya hanya akan pergi untuk memulai, menjalankan, ketik "Majelis", dan seret dan letakkan dll saya di.

Apakah ini tidak mungkin lagi? Ketika saya mencoba melakukan ini saya tidak mendapatkan pesan kesalahan, tetapi dll tidak muncul di folder "Majelis". Ketika saya menggunakan gacutil pada mesin dev saya berfungsi dengan baik, tetapi dll masih tidak muncul.

30
TizzyFoe

Di .net 4.0 Microsoft menghapus kemampuan untuk menambahkan DLL ke Majelis hanya dengan menyeret dan menjatuhkan.

Alih-alih, Anda perlu menggunakan gacutil.exe, atau membuat installer untuk melakukannya. Microsoft sebenarnya tidak merekomendasikan menggunakan gacutil, tetapi saya tetap menempuh rute itu.

Untuk menggunakan gacutil pada mesin pengembangan, buka:
Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010)

Kemudian gunakan perintah ini untuk menghapus dan menginstal ulang masing-masing. Catatan saya TIDAK menyertakan .dll dalam perintah uninstall.
gacutil /u myDLL
gacutil /i "C:\Program Files\Custom\myDLL.dll"

Untuk menggunakan Gacutil pada mesin non-pengembangan Anda harus menyalin file executable dan config dari mesin dev Anda ke mesin produksi. Sepertinya ada beberapa versi Gacutil yang berbeda. Salah satu yang bekerja untuk saya, saya temukan di sini:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exeC:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe.config

Salin file di sini atau ke folder .net yang sesuai;
C:\Windows\Microsoft.NET\Framework\v4.0.30319

Kemudian gunakan perintah ini untuk menghapus dan menginstal ulang masing-masing
"C:\Users\BHJeremy\Desktop\Installing to the Gac in .net 4.0\gacutil.exe" /u "myDLL"

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\gacutil.exe" /i "C:\Program Files\Custom\myDLL.dll"

52
TizzyFoe

Mungkin, saya perlu menyalin gacutil.exe, gacutil.exe.config DAN JUGA gacutil.dll (dari direktori 1033)

21
Roberto Montemor

Utilitas gacutil tidak tersedia pada mesin klien, dan lisensi Window SDK melarang mendistribusikannya kembali ke pelanggan Anda. Ketika pelanggan Anda tidak dapat, tidak akan, (dan benar-benar tidak boleh) mengunduh 300 MB Windows SDK sebagai bagian dari proses instalasi aplikasi Anda.

Ada API yang didukung secara resmi yang dapat Anda (atau pemasang Anda) gunakan untuk mendaftarkan Majelis di cache Majelis global. Teknologi Penginstal Windows Microsoft tahu cara memanggil API ini untuk Anda. Anda harus berkonsultasi dengan utilitas penginstal MSI Anda (mis. WiX, InnoSetup) untuk sintaks mereka sendiri tentang cara menunjukkan Anda ingin Majelis terdaftar di Cache Majelis Global.

Tetapi MSI, dan gacutil, tidak melakukan hal yang istimewa. Mereka cukup memanggil API yang sama yang bisa Anda panggil sendiri. Untuk dokumentasi tentang cara mendaftarkan Majelis melalui kode, lihat:

KB317540: DOC: API Global Assembly Cache (GAC) Tidak Didokumentasikan dalam Dokumentasi. (SDK) Dokumentasi Pengembangan Perangkat Lunak

var IAssemblyCache assemblyCache;
CreateAssemblyCache(ref assemblyCache, 0);


String manifestPath = "D:\Program Files\Contoso\Frobber\Grob.dll";

FUSION_INSTALL_REFERENCE refData;
refData.cbSize = SizeOf(refData); //The size of the structure in bytes
refData.dwFlags = 0; //Reserved, must be zero
refData.guidScheme = FUSION_REFCOUNT_FILEPATH_GUID; //The Assembly is referenced by an application that is represented by a file in the file system. The szIdentifier field is the path to this file.
refData.szIdentifier = "D:\Program Files\Contoso\Frobber\SuperGrob.exe"; //A unique string that identifies the application that installed the Assembly
refData.szNonCannonicalData = "Super cool grobber 9000"; //A string that is only understood by the entity that adds the reference. The GAC only stores this string

//Add a new Assembly to the GAC. 
//The Assembly must be persisted in the file system and is copied to the GAC.
assemblyCache.InstallAssembly(
      IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, //The files of an existing Assembly are overwritten regardless of their version number
      manifestPath, //A string pointing to the dynamic-linked library (DLL) that contains the Assembly manifest. Other Assembly files must reside in the same directory as the DLL that contains the Assembly manifest.
      refData);

Lebih banyak dokumentasi sebelum artikel KB dihapus:

Bidang-bidang struktur didefinisikan sebagai berikut:

  • cbSize - Ukuran struktur dalam byte.
  • dwFlags - Dicadangkan, harus nol.
  • guidScheme - Entitas yang menambahkan referensi.
  • szIdentifier - String unik yang mengidentifikasi aplikasi yang menginstal Majelis.
  • szNonCannonicalData - Sebuah string yang hanya dimengerti oleh entitas yang menambahkan referensi. GAC hanya menyimpan string ini.

Nilai yang mungkin untuk bidang guidScheme dapat berupa salah satu dari yang berikut:

FUSION_REFCOUNT_MSI_GUID - Majelis dirujuk oleh aplikasi yang telah diinstal dengan menggunakan Pemasang Windows. Bidang szIdentifier diatur ke MSI, dan szNonCannonicalData diatur ke Pemasang Windows. Skema ini hanya boleh digunakan oleh Pemasang Windows itu sendiri . FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID - Majelis dirujuk oleh aplikasi yang muncul di Tambah/Hapus Program. Bidang szIdentifier adalah token yang digunakan untuk mendaftarkan aplikasi dengan Tambah/Hapus program . FUSION_REFCOUNT_FILEPATH_GUID - Majelis dirujuk oleh aplikasi yang diwakili oleh file dalam sistem file. Bidang szIdentifier adalah jalur ke file ini . FUSION_REFCOUNT_OPAQUE_STRING_GUID - Majelis dirujuk oleh aplikasi yang hanya diwakili oleh string buram. SzIdentifier adalah string buram ini. GAC tidak melakukan pemeriksaan keberadaan untuk referensi buram ketika Anda menghapus ini.

4
Ian Boyd

jika Anda memiliki kerangka kerja .net perlu diinstal. Mis; .Net 4.0 atau .Net 3.5, maka Anda cukup menyalin Gacutil.exe dari salah satu mesin dan ke mesin baru. 

1) Buka CMD sebagai adminstrator di server baru.
2) Traverse ke folder tempat Anda menyalin Gacutil.exe. Untuk misalnya - C:\file program. (Dalam kasus saya).
3) Ketikkan di bawah ini di cmd Prompt dan instal.

C:\Program Files\gacutil.exe/I dllname

3

Alternatif lain untuk installer dan gacutil adalah alat GUI seperti Gac Manager atau GACAdmin . Atau jika Anda suka PowerShell Anda bisa menggunakan PowerShell GAC dari mana saya penulisnya. 

2
Lars Truijens

Perlu diingat bahwa Fusion API tidak dikelola. Referensi saat ini ada di sini: Panduan Pengembangan> Referensi API Tidak dikelola> Fusion

Namun, ada metode yang dikelola untuk menambahkan Majelis ke GAC: System.EnterpriseServices.Internal.Publish.GacInstall Dan, jika Anda perlu mendaftarkan Jenis apa pun:. DaftarAssembly

Referensi untuk kelas publikasi ada di sini: .NET Framework Kelas Library> System.EnterpriseServices Namespaces> System.EnterpriseServices.Internal

Namun, metode ini dirancang untuk menginstal komponen yang diperlukan oleh aplikasi layanan web seperti ASP.NET atau WCF. Akibatnya mereka tidak mendaftarkan majelis dengan Fusion; dengan demikian, mereka dapat dihapus instalannya oleh aplikasi lain, atau menggunakan gacutil dan menyebabkan Majelis Anda berhenti bekerja. Jadi, jika Anda menggunakannya di luar server web tempat administrator mengelola GAC ​​maka pastikan untuk menambahkan referensi ke aplikasi Anda di SOFTWARE\Wow6432Node\Microsoft\Fusion\Referensi (untuk OS 64-bit) atau SOFTWARE\Microsoft\Fusion\Referensi (untuk OS 32-bit) sehingga tidak ada yang dapat menghapus majelis dukungan Anda kecuali mereka menghapus aplikasi Anda.

1
Steve Wood