Referensi ke dll tidak dapat ditambahkan

95

Ketika saya menambahkan file .dll sebagai referensi di aplikasi C # itu menunjukkan kesalahan:

Referensi ke ".... dll" tidak dapat ditambahkan. Harap pastikan bahwa file dapat diakses dan merupakan komponen perakitan atau COM yang valid.

ILDissassembler mengatakan tidak ada header CLR yang valid jadi saya mencoba mendaftarkannya menggunakan regsvr32 dan itu memberi saya kesalahan lain:

Modul "" telah dimuat tetapi panggilan ke DLLRegisterServer gagal dengan kode kesalahan '0x80004005'

Saya menggunakan versi ultimate VS2010 pada mesin 64bit Windows 7. Apa masalahnya?

Terima kasih atas petunjuk / balasannya

pengguna20358
sumber

Jawaban:

53

Yang berikut berhasil untuk saya:

Jawaban singkat

Jalankan perintah berikut melalui baris perintah (cmd):

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

Dan dll yang valid akan dibuatkan untuk Anda.

Jawaban yang lebih panjang

  • Buka cmd

  • Temukan TlbImp.exe. Mungkin terletak di C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Jika Anda tidak dapat menemukannya, buka folder root Anda (C: \ atau D :) dan jalankan:

    dir tlbimp.exe /s              //this will locate the file.
  • Jalankan tlbimp.exe dan letakkan dll Anda di belakangnya. Contoh: Jika dll Anda adalah cvextern.dll. Anda dapat menjalankan:

    TlbImp.exe cvextern.dll
  • Sebuah dll baru telah dibuat di folder yang sama dengan tlbimp.exe. Anda dapat menggunakannya sebagai referensi dalam proyek Anda.
Memet Olsen
sumber
5
Cara lain untuk mengakses TlbImp.exe adalah dengan membuka prompt perintah Visual Studio.
Scott
75
@Memet Afer mencoba ini yang saya dapatkan, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.Ada Saran?
Dineshkumar
1
File input C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'bukan perpustakaan tipe yang valid
Christine
7
Memiliki kesalahan yang sama seperti yang dikemukakan oleh Dineshkumar Ponnusamy. Tolong bantu saya
deathrace
1
Kapan Anda perlu menggunakan TLBMP? Biasanya di VS2015 jika Anda hanya menambahkan referensi ke COM DLL dari jendela referensi itu menangani semua ini untuk Anda.
UuDdLrLrSs
20

Anda dapat menambahkan DLL (atau EXE) ke proyek hanya jika itu adalah rakitan .NET. Jika tidak, Anda akan melihat pesan kesalahan ini.

regsvr32 juga membuat asumsi tertentu tentang struktur dan fungsi yang diekspor di DLL. Sudah lama sejak saya menggunakannya tetapi ini berkaitan dengan mendaftarkan server COM sehingga titik masuk tertentu harus tersedia. Jika regsvr32 gagal DLL tidak menyediakan titik masuk tersebut dan DLL tidak berisi komponen COM.

Anda hanya memiliki kesempatan untuk menggunakan DLL untuk mengimpornya seperti biner non-.NET lainnya, misalnya ketika Anda menggunakan Win32 API tertentu. Ada Artikel Majalah MSDN lama yang mungkin bisa membantu. Lihat pembaruan berikut untuk info di mana mendapatkan artikel.

Pembaruan 12 Maret 2018: Tautan ke Majalah MSDN tidak lagi berfungsi seperti dulu pada Agustus 2010. Artikel oleh Jason Clark berjudul "Kolom .NET: Memanggil Win32 DLL di C # dengan P / Invoke". Itu diterbitkan dalam Majalah MSDN edisi Juli 2010. "Mesin Wayback" memiliki artikel di sini saat ini (pemformatan terbatas). Seluruh majalah MSDN edisi Juli 2010 tersedia di sini (hanya format HCM, petunjuk tentang cara menggunakan file HCM di sini ).

Manfred
sumber
Apakah ada cara untuk memastikan kompilator meletakkan .dll di folder keluaran meskipun itu bukan referensi?
Kyle Delaney
1
@KelinciSaya rasa kompilator tidak bisa melakukan itu. Saya akan mempertimbangkan untuk meletakkan perintah salin atau xcopy ke dalam acara pra-bangun / pasca-pembangunan dari proyek / solusi. Ini manual, tetapi umumnya referensi tidak terlalu sering berubah dan rangkaian pengujian yang tepat harus menangkap kasus di mana Anda lupa memperbarui perintah yang dijalankan dalam acara pra-build / post-build.
Manfred
Terima kasih balasannya!
Kyle Delaney
Tautan ke artikel sudah mati.
Roald
@Roald Terima kasih. Ya, tautannya memang rusak. Microsoft hanya menyediakan format HCM dari seluruh edisi Majalah MSDN di URL yang berbeda. Mesin Wayback juga memiliki snapshot dari artikel dalam format HTML dengan beberapa tampilan yang disederhanakan. Saya telah memperbarui jawaban untuk mencerminkan hal ini dan saya juga menghapus tautan rusak dari jawaban saya. Semoga ini membantu.
Manfred
12

Saya menggunakan dependency walker untuk memeriksa referensi internal yang dimiliki dll. Ternyata itu membutuhkan runtime VB msvbvm60.dll dan karena kotak dev saya tidak menginstalnya, saya tidak dapat mendaftarkannya menggunakan regsvr32

Sepertinya itulah jawaban dari pertanyaan awal saya untuk saat ini.

pengguna20358
sumber
Dalam kasus saya, saya harus menghapus folder obj untuk proyek yang saya coba rujuk dan kemudian saya membangun kembali proyek tersebut.
Tolu
7

Pastikan kompiler Anda disetel ke x86 jika Anda mencoba mereferensikan x86 dll ...

Saya mengalami masalah serupa ... seperti yang disebutkan di atas, mencoba menggunakan OLEDB untuk mengakses file Excel dari kode C # saya di Visual Studio 2012.

Saya terus mendapatkan kesalahan tentang pustaka Access yang tidak dapat diakses tetapi saya tahu bahwa saya telah memuatnya.

Selama Debug, saya sadar bahwa saya sedang mengompilasi untuk 64 bit tetapi Office x86 dimuat. Meskipun saya memuat pustaka Access untuk 32 bit, itu tidak pernah digunakan oleh aplikasi ... dan, oleh karena itu, tidak dapat diakses.

Inilah yang saya gunakan di C #:

"Penyedia = Microsoft.ACE.OLEDB.12.0; Sumber Data =" + strFilePath + "; Properti Diperluas = 'Excel 12.0 Xml; HDR = Ya'";

... Saya mendapatkan kesalahan

Segera setelah saya mengganti kompiler ke x86 itu berhasil

Robert Obergfoll
sumber
2

Saya baru saja mengalami masalah itu dan setelah semua penjelasan tentang memperbaikinya dengan command prompt, saya menemukan bahwa jika Anda menambahkannya langsung ke proyek, Anda dapat dengan mudah menyertakan pustaka pada setiap halaman yang diperlukan

JeffB
sumber
2

Saya memiliki masalah yang sama dengan mengimpor WinSCard.dll dalam proyek saya. Saya menangani itu mengimpor langsung dari dll seperti ini:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

Anda dapat menambahkan ini ke proyek terpisah dan kemudian menambahkan referensi dari proyek utama Anda.

Sashus
sumber
1

Saya mengalami masalah ini setelah PC saya dihidupkan ulang selama membangun solusi. Dua referensi saya hilang, jadi saya harus membangun kembali dua proyek saya secara manual dan kemudian saya dapat menambahkan referensi tanpa kesalahan.

Rafal Cypcer
sumber
1

Anda tidak dapat menambahkan referensi ke DLL asli . Namun Anda dapat memasukkannya ke dalam solusi (solusi klik kanan, pilih "Tambahkan file yang ada"), tetapi mereka tidak akan direferensikan kecuali Anda menyatakan sesuatu seperti

[DllImport("...")]
public static extern void MyFunction();

Mungkin ada sejenis pembungkus DLL, yang sebenarnya Anda rujuk dan yang berisi impor DLL.

Kadang-kadang, Anda dapat mereferensikan DLL pembungkus tetapi masih tidak dapat membuat program Anda berjalan, di mana prompt kesalahan menyarankan Anda untuk memastikan file tersebut ada dan semua dependensi tersedia.

Masalah ini karena perakitan yang Anda coba tambahkan ditargetkan dan dikompilasi hanya untuk x86 atau x64 arsitektur prosesor .

Coba saja ubah Target Platform ke x86 atau x64 di Build -> Configuration Manager .

Leon Wolf
sumber
1

Saya perlu mengubah arsitektur ke x86 dari x64 di manajer konfigurasi dan menyalin dll 32 bit saya (bahasa C - pcProxAPI.dll) ke dalam folder baru yang dibuat ini .. Ini di atas langkah-langkah yang dijelaskan oleh "Sashus" di bawah ini .

C: \ Proyek .. \ bin \ x86 \ Debug

boateng
sumber
Ini dia masalah untuk saya juga.
rogue39nin
tetapi apakah defaultnya bukan x86 atau x64? tapi .... "Any Cpu" muncul ...?
gumuruh
codeproject.com/articles/1160645/… Setiap cpu dapat bekerja dengan baik jika Anda menyalin dll 32 bit di sana
boateng
1

Saya memiliki masalah yang sama ketika saya mencoba menambahkan dll yang baru saja saya kodekan dalam C ++ ke proyek C # saya yang baru. Ternyata saya perlu mengatur properti proyek C ++ dll saya dari:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

Karena proyek C # di mana saya ingin menggunakan dll ini juga diatur seperti itu (memiliki properti yang sama /clr).

LoukMouk
sumber
Solution Explorer> Propertise> Configuration Propertise
Yuresh Karunanayake
@gumuruh Jika yang Anda maksud "apa itu clr?", maka CLR adalah docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

Saya menghadapi masalah yang sama. Saya mencoba menambahkan referensi dari .net 2.0 dll ke proyek .Net 1.1. Ketika saya mencoba menambahkan versi .dll sebelumnya yang sesuai dengan .Net 1.1. itu berhasil untuk saya.

pengguna2623151
sumber
0

Untuk orang lain yang mencari bantuan tentang masalah ini, atau mengalami FileNotFoundException atau FirstChanceException, lihat jawaban saya di sini:

Pengecualian kesempatan pertama dari jenis 'System.IO.FileNotFoundException' terjadi di mscorlib.ni.dll - windows phone

Secara umum Anda harus benar-benar yakin bahwa Anda memenuhi semua persyaratan untuk membuat referensi - Saya tahu itu jawaban yang jelas, tetapi Anda mungkin mengabaikan persyaratan yang relatif sederhana.

JHaps
sumber
Perhatikan perbedaan antara versi kerangka kerja dalam kaitannya dengan referensi - sering kali menggunakan versi kerangka kerja yang lebih baru seharusnya tidak membuat perbedaan.
JHaps
0

Saya mengalami kesalahan ini saat menulis Layanan Windows. Saya menjalankan Visual Studio sebagai Administrator sehingga perintah pembuatan posting saya akan secara otomatis menginstal layanan saya. Saya perhatikan bahwa ketika saya menutup semuanya dan menjalankan VS secara normal (Bukan sebagai Administrator) itu memungkinkan saya menambahkan referensi dengan baik tanpa kesalahan.

Semoga solusi ini berhasil untuk Anda.

Fütemire
sumber
0

Biasanya di Visual Studio 2015 Anda harus membuat proyek dll sebagai C ++ -> proyek CLR dari template Visual Studio, tetapi Anda secara teknis dapat mengaktifkannya setelah fakta:

Properti kritis disebut Common Language Runtime Supportset dalam konfigurasi proyek Anda. Itu ditemukan di bawah Configuration Properties > General > Common Language Runtime Support.

Saat melakukan ini, VS mungkin tidak akan memperbarui opsi 'Target .NET Framework' (seperti seharusnya). Anda dapat menambahkan ini secara manual dengan membongkar proyek Anda, mengedit file your_project.xxproj, dan menambahkan / memperbarui Target .NET framework Versiontag XML.

Sebagai contoh, saya sarankan untuk membuat solusi baru sebagai proyek C ++ CLR dan memeriksa XML di sana, bahkan mungkin membedakannya untuk memastikan tidak ada yang sangat penting yang tidak biasa.

Aaron Hull
sumber
0

Jawaban saya agak terlambat, tetapi sebagai tes cepat, pastikan Anda menggunakan perpustakaan versi terbaru.

Dalam kasus saya setelah memperbarui pustaka nuget yang mereferensikan pustaka lain yang menyebabkan masalah, masalahnya hilang.

Martin Staufcik
sumber
0

Anda dapat menambahkan file .dll secara manual. Misalnya jika Anda ingin menambahkan file dll di aplikasi WPF Anda, dan Anda tidak dapat merujuknya di proyek Anda

(Mendapatkan kesalahan: Referensi ke ".... dll" tidak dapat ditambahkan. Harap pastikan bahwa file dapat diakses dan merupakan komponen perakitan atau COM yang valid),

lalu COPY file dll itu dan PASTE di INSTALLER PROJECT (di folder aplikasi).

ARUN JOHN
sumber
0
  1. mulai cmd.exe dan ketik:
  2. Regsvr32% dllpath%
  3. "% dllpath%" ganti ke jalur dll Anda
charles chen
sumber