Saya mencoba menambahkan file app.config ke DLL saya, tetapi semua upaya gagal.
Menurut MusicGenesis di ' Menempatkan informasi konfigurasi dalam DLL ' ini seharusnya tidak menjadi masalah. Jadi jelas saya melakukan sesuatu yang salah ...
Kode berikut harus mengembalikan ConnectionString dari DLL saya:
return ConfigurationManager.AppSettings["ConnectionString"];
Namun, ketika saya menyalin file app.config ke aplikasi konsol saya, itu berfungsi dengan baik.
Ada ide?
c#
app-config
MegaByte
sumber
sumber
Jawaban:
Bukan hal sepele untuk membuat file konfigurasi .NET untuk .DLL, dan untuk alasan yang baik. Mekanisme konfigurasi .NET memiliki banyak fitur di dalamnya untuk memudahkan peningkatan / pembaruan aplikasi, dan untuk melindungi aplikasi yang terinstal dari menginjak-injak file konfigurasi satu sama lain.
Ada perbedaan besar antara bagaimana DLL digunakan dan bagaimana aplikasi digunakan. Anda tidak mungkin memiliki banyak salinan aplikasi yang diinstal pada mesin yang sama untuk pengguna yang sama. Tetapi Anda mungkin memiliki 100 aplikasi atau pustaka yang berbeda yang semuanya memanfaatkan beberapa .NET DLL.
Meskipun jarang ada kebutuhan untuk melacak pengaturan secara terpisah untuk salinan aplikasi yang berbeda dalam satu profil pengguna, sangat tidak mungkin bahwa Anda ingin semua penggunaan yang berbeda dari DLL untuk berbagi konfigurasi satu sama lain. Karena alasan ini, ketika Anda mengambil objek Konfigurasi menggunakan metode "normal", objek yang Anda dapatkan terkait dengan konfigurasi App Domain yang Anda jalankan, bukan pada rakitan tertentu.
App Domain terikat ke rakitan root yang memuat rakitan di mana kode Anda sebenarnya. Dalam kebanyakan kasus ini adalah rakitan utama .EXE Anda, yang merupakan apa yang memuat .DLL. Dimungkinkan untuk memutar domain aplikasi lain dalam suatu aplikasi, tetapi Anda harus secara eksplisit memberikan informasi tentang apa rakitan root dari domain aplikasi itu.
Karena semua ini, prosedur untuk membuat file konfigurasi perpustakaan khusus tidak begitu nyaman. Ini adalah proses yang sama yang akan Anda gunakan untuk membuat file konfigurasi portabel sewenang-wenang yang tidak terikat pada perakitan tertentu, tetapi Anda ingin memanfaatkan skema XML .NET, bagian konfigurasi dan mekanisme elemen konfigurasi, dll. Ini mencakup pembuatan
ExeConfigurationFileMap
objek. , memuat data untuk mengidentifikasi di mana file config akan disimpan, dan kemudian memanggilConfigurationManager
.OpenMappedExeConfiguration
untuk membukanya menjadiConfiguration
contoh baru . Ini akan memotong Anda dari perlindungan versi yang ditawarkan oleh mekanisme pembuatan jalur otomatis.Secara statistik, Anda mungkin menggunakan pustaka ini dalam pengaturan internal, dan sepertinya Anda tidak akan memiliki banyak aplikasi yang memanfaatkannya dalam satu mesin / pengguna. Tetapi jika tidak, ada sesuatu yang harus Anda ingat. Jika Anda menggunakan satu file konfigurasi global untuk DLL Anda, terlepas dari aplikasi yang mereferensikannya, Anda perlu khawatir tentang konflik akses. Jika dua aplikasi yang mereferensikan pustaka Anda berjalan pada saat yang sama, masing-masing dengan
Configuration
objeknya sendiri terbuka, maka ketika satu menyimpan perubahan, itu akan menyebabkan pengecualian saat Anda mencoba mengambil atau menyimpan data di aplikasi lain.Cara paling aman dan paling sederhana untuk menyiasatinya adalah dengan mengharuskan majelis yang memuat DLL Anda juga memberikan beberapa informasi tentang dirinya sendiri, atau untuk mendeteksinya dengan memeriksa App Domain dari rujukan referensi. Gunakan ini untuk membuat semacam struktur folder untuk menjaga file konfigurasi pengguna terpisah untuk setiap aplikasi yang mereferensikan DLL Anda.
Jika Anda yakin ingin memiliki pengaturan global untuk DLL Anda di mana pun itu direferensikan, Anda harus menentukan lokasi Anda untuk itu daripada. NET mencari yang tepat secara otomatis. Anda juga harus agresif dalam mengelola akses ke file. Anda harus melakukan cache sebanyak mungkin, menjaga
Configuration
instance hanya HANYA selama yang diperlukan untuk memuat atau menyimpan, membuka segera sebelum dan membuang segera setelah. Dan akhirnya, Anda akan memerlukan mekanisme kunci untuk melindungi file saat sedang diedit oleh salah satu aplikasi yang menggunakan perpustakaan.sumber
jika Anda ingin membaca pengaturan dari file konfigurasi DLL tetapi tidak dari aplikasi root web.config atau app.config gunakan kode di bawah ini untuk membaca konfigurasi di dll.
sumber
Saya memiliki masalah yang sama dan mencari di web selama beberapa jam tetapi saya tidak dapat menemukan solusi sehingga saya membuat sendiri. Saya bertanya-tanya mengapa sistem konfigurasi .net sangat tidak fleksibel.
Latar Belakang: Saya ingin memiliki DAL.dll saya untuk memiliki file konfigurasi sendiri untuk pengaturan database dan DAL. Saya juga memerlukan app.config untuk Enterprise Library dan konfigurasinya sendiri. Jadi saya membutuhkan app.config dan dll.config.
Apa yang tidak ingin saya lakukan adalah meneruskan setiap properti / pengaturan dari aplikasi ke lapisan DAL saya!
menekuk "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" tidak mungkin karena saya memerlukannya untuk perilaku app.config yang normal.
Persyaratan / sudut pandang saya adalah:
Saya datang dengan memodifikasi file Settings.cs dan menerapkan metode yang membuka ClassLibrary1.dll.config dan membaca informasi bagian dalam bidang pribadi. Setelah itu, saya mengesampingkan "this [string propertyName]" sehingga panggilan Settings.Desginer.cs dihasilkan ke Properti baru saya alih-alih kelas dasar. Di sana pengaturan dibaca dari Daftar.
Akhirnya ada kode berikut:
Anda hanya perlu menyalin ClassLibrary1.dll.config Anda dari direktori output ClassLibrary1 ke direktori output aplikasi Anda. Mungkin seseorang akan merasakan manfaatnya.
sumber
Saat menggunakan ConfigurationManager, saya cukup yakin itu memuat file proses /
AppDomain
konfigurasi (app.config / web.config). Jika Anda ingin memuat file konfigurasi tertentu, Anda harus secara khusus meminta file itu dengan nama ...Kamu bisa mencoba:
sumber
ConfigurationManager.AppSettings mengembalikan pengaturan yang ditentukan untuk aplikasi, bukan untuk DLL tertentu, Anda dapat mengaksesnya tetapi pengaturan aplikasi yang akan dikembalikan.
Jika Anda menggunakan Anda dll dari aplikasi lain maka ConnectionString harus di app.settings aplikasi.
sumber
Saya tahu ini terlambat ke pesta, namun saya pikir saya akan membagikan solusi yang saya gunakan untuk DLL.
Saya lebih dari aliran pemikiran KISS, jadi ketika saya memiliki .NET DLL yang ingin menyimpan titik data eksternal yang mengontrol cara kerjanya atau ke mana ia pergi, dll. Saya hanya membuat kelas "config" yang hanya memiliki properti publik yang menyimpan semua titik data yang dibutuhkan dan bahwa saya ingin dapat mengontrol eksternal ke DLL untuk mencegah kompilasi ulang untuk membuat perubahan. Kemudian saya menggunakan .Net's XML Serializing untuk menyimpan dan memuat representasi objek dari kelas ke file.
Ada banyak cara untuk menangani membacanya dan mengaksesnya, dari Singleton, kelas utilitas statis, hingga metode ekstensi, dll. Ini tergantung pada bagaimana DLL Anda disusun dan metode apa yang paling cocok untuk DLL Anda.
sumber
Anda benar, Anda dapat membaca file konfigurasi dll. Saya berjuang dengan ini selama satu hari sampai saya menemukan bahwa file konfigurasi saya adalah masalahnya. Lihat kode saya di bawah ini. itu bisa berjalan.
saya
Plugin1.dll.config
melihat seperti di bawah ini;Saya menemukan bahwa file konfigurasi saya tidak memiliki
<appSettings>
tag, jadi lihat-lihat, masalah Anda mungkin berbeda tetapi tidak begitu jauh dari saya.sumber
Karena rakitan berada di cache sementara, Anda harus menggabungkan jalur untuk mendapatkan konfigurasi dll:
sumber
Jika Anda menggunakan pustaka yang mencari sejumlah besar pengaduan di belakang layar, seperti WCF, Anda dapat mempertimbangkan melakukan ini:
Atau di PowerShell:
IMO teknik ini adalah bau kode dan benar-benar hanya cocok untuk digunakan dalam skrip ad hoc. Jika Anda mendapati diri Anda ingin melakukan ini dalam kode produksi, mungkin sekarang saatnya untuk tinjauan arsitektur.
Berikut ini TIDAK dianjurkan:
Sebagai keingintahuan teknis, inilah variasi pada tema. Anda dapat membuat konstruktor statis di dalam salah satu kelas yang bertempat di DLL, dan membuat panggilan ini dari sana. Saya tidak akan merekomendasikan melakukan ini kecuali sebagai pilihan terakhir.
sumber
Solusi lengkap tidak sering ditemukan di satu tempat ...
1) Buat file konfigurasi aplikasi dan beri nama "yourDllName.dll.config"
2) Klik kanan pada file konfigurasi yang dibuat di atas di VS Solution Explorer, klik properti
--- set "Build Action" = Konten
--- set "Salin Ke Direktori Output" = Selalu
3) Tambahkan bagian appSettings ke file konfigurasi (yourDllName.dll.config) dengan yourKeyName dan yourKeyValue Anda
4) Tambahkan System.Configuration ke dll / kelas / referensi proyek Anda
5) Tambahkan pernyataan menggunakan ke kode Anda di mana Anda bermaksud untuk mengakses pengaturan konfigurasi
6) Untuk mengakses nilai
7) bersukacita, itu berhasil
IMHO, ini seharusnya hanya digunakan ketika mengembangkan dll / perpustakaan baru.
File konfigurasi akhirnya menjadi referensi yang bagus, karena ketika Anda menambahkan pengaturan aplikasi dll ke aplikasi Anda yang sebenarnya.
sumber
Sepertinya file konfigurasi ini benar-benar membingungkan untuk diklarifikasi karena perilaku mereka berubah dari lingkungan dev ke penyebaran. Rupanya DLL dapat memiliki file konfigurasi sendiri, tetapi begitu Anda menyalin dan menempelkan dll (bersama dengan file konfigurasi mereka) di tempat lain, semuanya berhenti bekerja. Satu-satunya solusi adalah dengan menggabungkan file app.config secara manual menjadi satu file, yang hanya akan digunakan oleh eksekutif. Misalnya, myapp.exe akan memiliki file myapp.exe.config yang berisi semua pengaturan untuk semua dll yang digunakan oleh myapp.exe. Saya menggunakan VS 2008.
sumber
Saya telah menemukan apa yang tampaknya merupakan solusi yang baik untuk masalah ini. Saya menggunakan VS 2008 C #. Solusi saya melibatkan penggunaan ruang nama yang berbeda antara beberapa file konfigurasi. Saya telah memposting solusinya di blog saya: http://tommiecarter.blogspot.com/2011/02/how-to-access-multiple-config-files-in.html .
Sebagai contoh:
Namespace ini membaca / menulis pengaturan dll:
Namespace ini membaca / menulis pengaturan exe:
Ada beberapa peringatan yang disebutkan dalam artikel. HTH
sumber
Seperti kata Marc, ini tidak mungkin (walaupun Visual Studio memungkinkan Anda untuk menambahkan file konfigurasi aplikasi dalam proyek perpustakaan kelas).
Anda mungkin ingin memeriksa kelas AssemblySettings yang tampaknya memungkinkan file konfigurasi perakitan.
sumber
Dalam posting ini masalah yang sama dibahas dan menyelesaikan masalah saya. Bagaimana cara memuat file Pengaturan Aplikasi terpisah secara dinamis dan bergabung dengan pengaturan saat ini? mungkin helpfu
sumber
Untuk dll, seharusnya tidak tergantung pada konfigurasi karena konfigurasi dimiliki oleh aplikasi dan bukan oleh dll.
Ini dijelaskan di sini
sumber
Anda dapat menggunakan kode ini:
sumber