Dll'ye referans eklenemedi


95

C # uygulamasına referans olarak bir .dll dosyası eklediğimde bir hata gösteriyor:

".... dll" ye referans eklenemedi. Lütfen dosyanın erişilebilir olduğundan ve geçerli bir derleme veya COM bileşeni olduğundan emin olun.

ILDissassembler geçerli bir CLR başlığı olmadığını söylüyor, bu yüzden onu regsvr32 kullanarak kaydetmeye çalışıyorum ve bu bana başka bir hata veriyor:

"" Modülü yüklendi ancak DLLRegisterServer çağrısı '0x80004005' hata koduyla başarısız oldu

64bit Windows 7 makinesinde VS2010 nihai sürümünü kullanıyorum. Sorun ne olabilir?

Herhangi bir ipucu / yanıt için teşekkürler

Yanıtlar:


54

Aşağıdakiler benim için çalıştı:

Kısa cevap

Aşağıdakileri komut satırı (cmd) aracılığıyla çalıştırın:

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

Ve sizin için geçerli bir dll oluşturulacaktır.

Daha uzun cevap

  • Cmd'yi aç

  • TlbImp.exe dosyasını bulun. Muhtemelen C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin konumunda bulunur. Bulamazsanız, kök klasörünüze (C: \ veya D :) gidin ve şunu çalıştırın:

    dir tlbimp.exe /s              //this will locate the file.
    
  • Tlbimp.exe dosyasını çalıştırın ve dll'nizi arkasına yerleştirin. Örnek: dll'niz cvextern.dll ise. Koşabilirsin:

    TlbImp.exe cvextern.dll
    
  • Tlbimp.exe ile aynı klasörde yeni bir dll oluşturulmuştur. Bunu projenizde referans olarak kullanabilirsiniz.

5
TlbImp.exe'ye erişmenin başka bir yolu, bir Visual Studio komut istemi açmaktır.
Scott

75
@Memet Afer bunu denedim, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.Herhangi bir Öneriniz var mı?
Dineshkumar

1
Giriş dosyası C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'geçerli bir tür kitaplığı değil
Christine

7
Dineshkumar Ponnusamy tarafından belirtildiği gibi aynı hataya sahip olmak. Lütfen bana yardım et
deathrace

1
TLBMP'yi ne zaman kullanmanız gerekir? Normalde VS2015'te, referans penceresinden COM DLL'ye referansı eklerseniz, tüm bunları sizin için halleder.
UuDdLrLrSs

20

Yalnızca .NET derlemesiyse bir projeye DLL (veya EXE) ekleyebilirsiniz. Değilse, bu hata mesajını göreceksiniz.

regsvr32 ayrıca DLL'deki yapı ve dışa aktarılan işlev hakkında bazı varsayımlarda bulunur. Kullandığımdan bu yana uzun zaman geçti, ancak COM sunucularının kaydedilmesiyle ilgili olması gerekiyor, bu nedenle belirli giriş noktalarının mevcut olması gerekiyor. Regsvr32 başarısız olursa, DLL bu giriş noktalarını sağlamaz ve DLL bir COM bileşeni içermez.

DLL'yi kullanmak için tek şansınız, onu diğer .NET dışı ikili dosyalar gibi içe aktarmaktır, örneğin belirli Win32 API'lerini kullandığınızda. Yardımcı olabilecek eski bir MSDN Dergisi Makalesi var. Makaleyi nereden alacağınızla ilgili bilgi için aşağıdaki güncellemeye bakın.

Güncelleme 12 Mart 2018: MSDN Magazine bağlantısı artık Ağustos 2010'da eskisi gibi çalışmamaktadır. Jason Clark'ın makalesi ".NET Sütunu: C # ile P / Invoke ile Win32 DLL'leri Çağırma" başlıklı. MSDN Magazine'in Temmuz 2010 sayısında yayınlandı. "Wayback Makinesi" makalesi var burada (biçimlendirme sınırlıdır) şu anda. Temmuz 2010'daki MSDN Magazine sayısının tamamı burada mevcuttur (yalnızca HCM biçimi, HCM dosyalarının nasıl kullanılacağına ilişkin talimatlar burada ).


Bir referans olmasa bile derleyicinin çıktı klasörüne bir .dll koyduğundan emin olmanın bir yolu var mı?
Kyle Delaney

1
@KyleDelaney Derleyicinin bunu yapabileceğini sanmıyorum. Projenin / çözümün pre-build / post-build olayına bir kopya veya xcopy komutu koymayı düşünürdüm. Yine de manueldir, ancak genellikle referanslar çok sık değişmez ve uygun bir test paketi, derleme öncesi / derleme sonrası olayında yürütülen komutları güncellemeyi unuttuğunuz durumları yakalamalıdır.
Manfred

Yanıt için teşekkürler!
Kyle Delaney

Makalenin bağlantısı kesildi.
Roald

@Roald Teşekkürler. Evet, bağlantı gerçekten koptu. Microsoft, yalnızca tüm MSDN Magazine sayısının HCM biçimini farklı bir URL'de sağlar. Wayback Machine ayrıca, basitleştirilmiş bir görünüme sahip HTML formatında yalnızca makalenin anlık görüntüsüne sahiptir. Cevabı bunu yansıtacak şekilde güncelledim ve ayrıca bozuk bağlantıyı cevabımdan kaldırdım. Bu yardımcı olur umarım.
Manfred

12

Dll'nin sahip olduğu dahili referansları kontrol etmek için bağımlılık yürüteçini kullandım. VB çalışma zamanı msvbvm60.dll'ye ihtiyaç duyduğu ortaya çıktı ve dev kutumda yüklü olmadığı için regsvr32'yi kullanarak kaydettiremedim

Şimdilik asıl sorumun cevabı bu gibi görünüyor.


Benim durumumda başvurmaya çalıştığım proje için obj klasörünü silmek zorunda kaldım ve ardından projeyi yeniden oluşturdum.
Tolu

7

Bir x86 dll'ye başvurmaya çalışıyorsanız, derleyicinizin x86 olarak ayarlandığından emin olun ...

Yukarıda belirtildiği gibi benzer sorunlar yaşıyordum ... Visual Studio 2012'de C # kodumdan bir Excel dosyasına erişmek için OLEDB'yi kullanmaya çalışıyordum.

Access kitaplığının erişilebilir olmamasıyla ilgili hatalar almaya devam ettim, ancak onu yüklediğimi biliyordum.

Hata Ayıklama sırasında, 64 bit için derlediğimi ancak Office x86'nın yüklü olduğunu fark ettim. Access kitaplığını 32 bit için yüklememe rağmen, uygulama tarafından hiç kullanılmıyordu ... ve bu nedenle erişilebilir değildi.

İşte C # 'da kullandığım şey:

"Sağlayıcı = Microsoft.ACE.OLEDB.12.0; Veri Kaynağı =" + strFilePath + "; Genişletilmiş Özellikler = 'Excel 12.0 Xml; HDR = Evet'";

... bir hata alıyordum

Derleyiciyi x86'ya geçirir değiştirmez işe yaradı


2

Bu sorunla az önce karşılaştım ve komut istemiyle düzeltmeyle ilgili tüm açıklamalardan sonra, onu doğrudan projeye eklerseniz, gerekli olan her sayfaya kitaplığı dahil edebileceğinizi buldum.


2

Projemde WinSCard.dll dosyasını içe aktarırken aynı sorunu yaşıyorum. Bunun doğrudan dll'den içe aktarılmasıyla şu şekilde ilgileniyorum:

[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);

Bunu ayrı bir projeye ekleyebilir ve ardından ana projenizden bir referans ekleyebilirsiniz.


1

Çözümü oluştururken bilgisayarım yeniden başlatıldıktan sonra bu sorunu yaşadım. İki referansım gitti, bu yüzden iki projemi manuel olarak yeniden oluşturmak zorunda kaldım ve sonra hatasız referanslar ekleyebildim.


1

Yerel bir DLL'ye başvuru ekleyemezsiniz . Bununla birlikte, bunları çözüme dahil edebilirsiniz (sağ tıklama çözümü, "Mevcut dosyayı ekle" yi seçin), ancak böyle bir şey belirtmediğiniz sürece bunlara başvurulmayacaktır.

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

Belki de aslında başvurduğunuz ve DLL içe aktarımlarını içeren bir tür sarmalayıcı DLL vardır.

Bazen, sarmalayıcı DLL'ye başvurabilirsiniz, ancak yine de programınızı çalıştıramazsınız; burada hata istemi, dosyanın var olduğundan ve tüm bağımlılıkların kullanılabilir olduğundan emin olmanızı önerir.

Bu sorun, eklemeye çalıştığınız derlemenin yalnızca bir x86 veya x64 işlemci mimarisi için hedeflenmiş ve derlenmiş olmasıdır .

Build -> Configuration Manager'da Hedef Platformu x86 veya x64 olarak değiştirmeyi deneyin .


1

Yapılandırma yöneticisinde mimariyi x64'ten x86'ya değiştirmem ve 32 bit dll'mi (C dili - pcProxAPI.dll) bu oluşturulan yeni klasöre kopyalamam gerekiyordu .. Bu, aşağıda "Sashus" tarafından açıklanan adımların üstünde .

C: \ Projeler .. \ bin \ x86 \ Hata Ayıklama


Bu benim için de sorun oldu.
rogue39nin

ama varsayılan x86 veya x64 değilse? ama .... "Herhangi bir Cpu" geldi ...?
gumuruh

codeproject.com/articles/1160645/… Orada 32 bit dll'yi kopyalarsanız herhangi bir işlemci de çalışabilir
boateng

1

Yeni C # projeme az önce C ++ ile kodladığım bir dll eklemeye çalıştığımda da aynı sorunu yaşadım. C ++ projesinin özelliklerini ayarlamam gerektiği ortaya çıktı benim dll:

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

Çünkü bu dll'yi kullanmak istediğim C # projesi de böyle ayarlandı (aynı özelliklere sahipti /clr).


Çözüm Gezgini> Özellik> Yapılandırma Özelliği
Yuresh Karunanayake

@gumuruh "clr nedir?" demek istiyorsanız, CLR, docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

Ben de benzer bir sorunla karşılaştım. Bir .net 2.0 dll'nin referansını .Net 1.1 projesine eklemeye çalışıyordum. .Dll'nin .Net 1.1 ile uyumlu olan önceki bir sürümünü eklemeye çalıştığımda. benim için çalıştı.


0

Bu konuda yardım arayan veya bir FileNotFoundException veya FirstChanceException yaşayan başka biri için cevabıma buradan göz atın:

Mscorlib.ni.dll'de 'System.IO.FileNotFoundException' türünde ilk şans istisnası oluştu - Windows Phone

Genel olarak, referans yapmak için tüm gereksinimleri karşıladığınızdan kesinlikle emin olmalısınız - bunun bariz cevap olduğunu biliyorum, ancak muhtemelen nispeten basit bir gereksinimi gözden kaçırıyorsunuz.


Referansla ilgili olarak çerçeve sürümleri arasındaki farklılıklara bakın - çoğu zaman daha yeni bir çerçeve sürümü kullanmak bir fark yaratmamalıdır.
JHaps

0

Bir Windows Hizmeti yazarken bu hatayı aldım. Visual Studio'yu Yönetici olarak çalıştırıyordum, böylece derleme sonrası komutlarım hizmetimi otomatik olarak yükleyecekti. Her şeyi kapattığımda ve VS'yi normal olarak çalıştırdığımda (Yönetici olarak değil), referansları hatasız bir şekilde eklememe izin verdiğini fark ettim.

Umarım bu çözüm sizin için çalışır.


0

Normalde Visual Studio 2015'te dll projesini Visual Studio'nun şablonlarından bir C ++ -> CLR projesi olarak oluşturmalısınız, ancak gerçeğin ardından teknik olarak etkinleştirebilirsiniz:

Kritik özellik, Common Language Runtime Supportprojenizin yapılandırmasında set olarak adlandırılır . Altında bulunur Configuration Properties > General > Common Language Runtime Support.

Bunu yaparken, VS muhtemelen 'Hedef .NET Framework' seçeneğini güncellemeyecektir (olması gerektiği gibi). Bunu, projenizi kaldırarak, your_project.xxproj dosyasını düzenleyerek ve Target .NET framework VersionXML etiketini ekleyerek / güncelleyerek manuel olarak ekleyebilirsiniz .

Bir örnek için, bir C ++ CLR projesi olarak yeni bir çözüm oluşturmayı ve orada XML'i incelemeyi, hatta belki de sıra dışı hiçbir şeyin çok önemli olmadığından emin olmak için onu ayırmayı öneriyorum.


0

Cevabım biraz geç, ancak hızlı bir test olarak kütüphanelerin en son sürümünü kullandığınızdan emin olun.

Benim durumumda, soruna neden olan başka bir kitaplığa başvuran bir nuget kitaplığını güncelledikten sonra sorun ortadan kalktı.


0

.Dll dosyasını manuel olarak ekleyebilirsiniz. Örneğin, WPF uygulamanıza bir dll dosyası eklemek istiyorsanız ve projenizde buna başvuramıyorsanız

(Hata alma: ".... dll" ye referans eklenemedi. Lütfen dosyanın erişilebilir olduğundan ve geçerli bir derleme veya COM bileşeni olduğundan emin olun),

sonra bu dll dosyasını KOPYALAYIN ve MONTAJCI PROJESİNE YAPIŞTIRIN (uygulama klasörüne).


0
  1. cmd.exe'yi başlatın ve şunu yazın:
  2. Regsvr32% dllpath%
  3. "% dllpath%", dll yolunuza değiştirin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.