Tür, başvurulmayan bir derlemede tanımlanır, neden nasıl bulunur?


83

Hata mesajının yaygın olduğunu ve bu hatayla ilgili SO'da pek çok soru olduğunu biliyorum, ancak şu ana kadar hiçbir çözüm bana yardımcı olmadı, bu yüzden soruyu sormaya karar verdim. Benzer soruların çoğundan farkı, App_Code dizinini kullanmamdır.

Hata mesajı:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Kaynak dosyası:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

Önerileri yerine burada ve burada , ben C içindeki Project.Rights.dll tüm örneklerini sildiniz: \ Windows \ Microsoft.NET /*.* göre bu , kontrol ettim söz konusu .cs dosyaları "Derleme" için inşa eylem kümesi varsa . Onlar yapar. Ayrıca "Project.Rights.OperationsProvider" türünü içeren .cs dosyasının App_Code dizinine konuşlandırıldığını iki kez kontrol ettim.

Bazı nedenlerden dolayı, uygulama türü App_Code dizininde aramıyor. Project.Rights.dll'nin (bildiğim) tüm örneklerini sildiğim için, hata mesajının hangi derlemeden bahsettiğini bilmiyorum.


6
Project.Rights.OperationsProvider türünde bir yöntemi / özelliği / bir şeyi ortaya çıkaran bir sınıf ( A diyelim ) kullanıyorsunuz. Derleyicinin ne olduğunu bilmesi gerekir, daha sonra bu derlemeyi arayacaktır (Project.Rights). Bulamazsa (web sitesi projenizde referansınız olmadığı için) ... bu hatayı alırsınız. Çözüm: Bu düzeneği sisteminizden ÇIKARMAYIN !!! Bir referans EKLEYİN.
Adriano Repetti

2
Araçlara gitmeyi deneyin - seçenekler - projeler ve çözümler - derleyin ve çalıştırın - her iki ayrıntıyı da Ayrıntılı olarak ayarlayın. Bu size bağımlılığın ne olduğunu ve derleyicinin onu nerede aradığını söyleyecektir.
danludwig

Yanıtlar:


100

Bu hatayı aldığınızda ne olduğu her zaman açık değildir, ancak hatanın dediği gibi - bir referansı kaçırıyorsunuz. Örnek olarak aşağıdaki kod satırını alın:

MyObjectType a = new MyObjectType("parameter");

Yeterince basit görünüyor ve muhtemelen "MyObjectType" a doğru referans verdiniz. Ancak "MyObjectType" kurucusunun aşırı yüklemelerinden birinin başvurmadığınız bir türü aldığını varsayalım. Örneğin şu şekilde tanımlanan bir aşırı yük vardır:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

Bu, bu hatayı alacağınız en az bir durumdur. Bu nedenle, türe başvurduğunuz, ancak bu türde çağrılan işlevler için mümkün olan özelliklerin veya yöntem parametrelerinin tüm türlerini değil, bu tür modeli arayın.

Umarım bu en azından doğru yöne gitmenizi sağlar!


16
Uzantı yöntemleri hakkında not: İki sınıfın aynı ada sahip uzantı yöntemleri varsa, bir türdeki parametreler, başka bir türden uzantı yönteminin kullanımını "etkileyebilir".
athari

@Athari teşekkür ederim, bunu asla
anlayamazdım

Bir süre baktıktan sonra bu cevabı tesadüfen buldum. Bu tam olarak benim sorunum ve açıklamanız çok yardımcı oldu. Teşekkürler yükler.
Diane

1
Peki ya yapıcıyı referansla kullanmak istemiyorsam? Diğerlerini referans eklemeden kullanmak istiyorum. Görünüşe göre bu mümkün olmalı.
Robert Iagar

1
Bu gerçekten tuhaf görünüyor, ancak bu hatayı aldım çünkü derleme isimlerinden biri durumunda bir uyumsuzluk yaşadım (nuget büyük / küçük harfe duyarlı gibi görünüyor?)! Kitaplık C referans kitaplıkları B ve A vardı. Kitaplık B de kitaplık A'ya başvurdu, ancak A'yı bağımlılık olarak 'A' yerine 'a' adını kullanarak paketledi. Bina kütüphanesi C, bağımlılığın adını B'deki düzeltene kadar bu hatayı almaya devam ettim!
Tolu

49

Projelerde hedef çerçeveyi kontrol edin.

Benim durumumda "Montaj için bir referans eklemelisiniz" aslında çağıran ve referans projelerinin aynı hedef çerçeveye sahip olmadığı anlamına geliyordu. Çağıran projede .Net 4.5 vardı, ancak başvurulan kitaplık 4.6.1 hedefine sahipti.

Eminim ki MS derleyicisi daha akıllı olabilir ve daha anlamlı hata mesajı kaydedebilir. Https://github.com/dotnet/roslyn/issues/14756 adresine bir öneri ekledim


16

Bir Nuget paket güncellemesi yapan tek bir dll bağımlılık başvurular güncellenen çünkü Benim durumumda bu oldu bazı ama hepsi değil versiyonlarını çelişen sonuçlanan - benim çözümde projeler. Çözümümde * .csproj dosyalarında metin aramak için grep tarzı bir araç kullanmak , daha sonra hala güncellenmesi gereken projeleri görmek kolay oldu.


Bu yanıt için teşekkürler - Buna yakın bir şey olduğunu düşündüm ama bunu gördüğüme sevindim. Başka bir deyişle - veri katmanımda isteğe bağlı bir parametreye sahip bir kurucuyu çağıran üst projem (hizmet), bu başvuruyu .csproj dosyasına eklememişti. Alt ve üst .csproj dosyalarının karşılaştırılması, olmayan üst öğede olması gereken bir ÖğeGrubu aydınlatmalıdır.
Ryanman

3
Çözüm için Visual Studio Paket Yöneticisi penceresi (bireysel proje için değil), hangi paketlerin farklı projelerde farklı sürümlere sahip olduğunu gösteren Konsolidasyon sekmesine sahiptir . Grep benzeri bir araçtan çok daha iyi
Michael Freidgeim

7

Bu hatayı aldığınızda, kullandığınız kodun bir derlemede bulunan bir türe referans yaptığı, ancak derlemenin projenizin bir parçası olmadığı ve bu nedenle onu kullanamayacağı anlamına gelir.

Project.Rights.dll dosyasını silmek istediğinizin tam tersidir. Projenizin montajı referans alabileceğinden emin olmanız gerekir. Bu nedenle, Global Assembly Cache veya web uygulamanızın ~ / Bin dizinine yerleştirilmelidir.

Düzenleme - Montajı kullanmak istemiyorsanız, silmek de uygun bir çözüm değildir. Bunun yerine, kodunuzdaki tüm referansları kaldırmanız gerekir. Derlemeye yazdığınız kod tarafından doğrudan ihtiyaç duyulmadığından, bunun yerine başvurduğunuz başka bir şey tarafından gerekli olduğundan, bu başvurulan derlemeyi bağımlılık olarak Project.Rights.dll içermeyen bir şeyle değiştirmeniz gerekir.


2
Montajı kullanamıyorum, bu bir gereklilik. Ondan kurtulmam ve sınıfı App_Code dizininde saklamam gerekiyor. Kulağa nasıl geldiğini biliyorum, inan bana. Tüm iş mantığının DLL'ler yerine App_Code içinde depolanması için bir uygulamayı değiştirme görevinin verilmesi ... eğlenceli değil.
afaf12

1
Hayır, ona referansla bir şey kullandığı anlamına gelir (doğrudan kullandığı değil). @ afaf12 eğer ondan kurtulmak zorundaysanız ... onu kimin kullandığını kontrol etmelisiniz (bunu dolaylı bir referans olarak düşünün ). Kodu App_Code dizinine basitçe yapıştıramazsınız, derlenmiş herhangi bir derleme orijinal (ve harici) olanı referans
almaya devam eder

Bir benzerim vardı ve gönderiniz çok yardımcı oldu. Benim durumumda başvurulan bir "A" derlemesine sahiptim. Bu derleme başka bir "B" derlemesi kullanıyordu. Projeme eklememe rağmen "B" derlemesinin eksik olduğuna dair bir hata almaya devam ettim. "B" derlemesini bin dizinime kopyaladığımda sorun çözüldü. Bunun nedeni, projemin "B" derlemesini kullanmaması, "A" derlemesinin kullanması ve bunu bulmaması ve dolayısıyla bir istisna oluşturmasıdır. Teşekkürler.
ykh

4

Benim durumumda, yanlış Platform / Konfigürasyona inşa edilen bir kitaplığa başvuruyordum (başvurulan kitaplığı yeni oluşturdum).

Ayrıca, sorunu Visual Studio Configuration Manager'da çözemedim - bu kitaplık için yeni Platformlar ve Yapılandırmalar arasında geçiş yapıp oluşturamadım. O proje ProjectConfigurationPlatformsiçin .slndosyanın bölümündeki girişleri düzelterek düzelttim . Tüm permütasyonları olarak ayarlandı Debug|Any CPU(bunu nasıl yaptığımdan emin değilim). Çalışmakta olan bir proje için olanların üzerine bozuk proje girişlerinin üzerine yazdım ve her giriş için GUID'i değiştirdim.

İşleyen proje için girişler

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

Bozuk proje girişleri

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

Bozuk girişler artık düzeltildi

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

Umarım bu birine yardımcı olur.


Benim için benzerdi. VIsual Studio, projelerimden bazıları için GUID'leri FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) yerine 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET) olarak değiştirdi. Onları geri değiştirdikten sonra her şey yolunda gitti.
scor4er

3

Farklı projelerin aynı dll'nin farklı kopyalarına referans verdiğini fark ettim. Hepsinin diskteki aynı dosyaya başvurduğundan emin oldum ve beklediğim gibi hata ortadan kalktı.


1

.NET Assemblies sekmesinden referansı eklemeye çalıştığımda işime yaramadı. BROWSE ile referansı C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319'a eklediğimde işe yaradı.


0

ana nedenlerden biri, specific version propertydoğru olup olmadığını kontrol etmek için herhangi bir şey yapmadan önce yapmanız gereken DLL'nin özelliği olabilir.

Sebep: belki kaynak kodu, onu oluşturduğunuzda diğer (eski) sürümle birleştirildi, ancak bu Kitaplık yeni güncellemeyle yükseltildi, sürüm artık Assembly Cash'te farklı ve uygulamanızın yeni DLL alması yasak ve uygulamanızı devre dışı bıraktıktan sonra specific version propertyapplacaten ücretsiz olacak DLL referanslarının yeni sürümünü almak için


0

Belki kullandığınız bir kitaplık (DLL dosyası) başka bir kitaplık gerektiriyordur. Benim durumumda, bir veritabanı varlık modeli içeren bir kitaplığa başvurdum - ancak varlık çerçeve kitaplığına başvurmayı unuttum.


0

Bu aynı zamanda, bir kitaplıkta tanımlanan (genel) türleri ortaya çıkaran bir kitaplık kullandığınız anlamına da gelebilir. Bunları özellikle kitaplığınızda kullanmadığınızda bile (oluşturmayan kitap ).

Bunun muhtemelen engellediği şey, kullanamayacağınız bir sınıfı (imzasında referans alınmayan bir kitaplıktan türlere sahip olan) kullanan kod yazmanızdır.


0

Benim için hatanın ortaya çıkmasının nedeni, hatanın bildirildiği WebForm'un başka bir klasörden taşınması, ancak kod dosyası sınıfının adının değişmeden kalması ve gerçek yola karşılık gelmemesiydi.

Başlangıç ​​durumu:
Orijinal dosya yolu: /Folder1/Subfolder1/MyWebForm.aspx.cs Orijinal kod dosyası
sınıf adı: Folder1_Subfolder1_MyWebForm


Dosya taşındıktan sonra: Dosya yolu: /Folder1/MyWebForm.aspx.cs
Codefile sınıf adı (değiştirilmedi, gösterilen hata ile): Folder1_Subfolder1_MyWebForm

Çözüm:
yeniden adlandırma sizin codefile sınıf Folder1_Subfolder1_MyWebForm
için tek tekabül ile yeni yolu :Folder1_MyWebForm

Hepsi birden - sorun çözüldü, hata bildirimi yok ..


0

'Domain.tblUser' türü, başvurulmayan bir derlemede tanımlandı. 'Etki Alanı, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null' derlemesine bir başvuru eklemelisiniz.

**Solved:**
 Add reference of my domain library layer to my web app libary layer

Not: Referanslarınızın DI kapsayıcınıza göre doğru olduğundan emin olun


0

Benim durumumda bunun nedeni kullandığım

Örtük Operatör

arasında BLLve DALkullanmak istiyorum classes.when BLLUygulama katmanı olarak Katmanı bu hata var. Ben değiştim

örtük operatör

-e

açık operatör

tamam olacak. Teşekkürler


0

Benim durumumda başvurulan dll sürümü aslında daha önce sahip olduğumdan daha yeniydi.

Sadece önceki sürüme geri dönmem gerekiyordu ve bu onu düzeltti.


0

Benim için bunun nedeni, hem doğrudan hem de dolaylı olarak (başka bir bağımlılık yoluyla) farklı montaj adlarına sahip iki farklı Bouncy Castle yapısına atıfta bulunan projeydi. Bouncy Castle yapılarından biri NuGet paketiydi, diğeri ise GitHub'dan indirilen kaynağın hata ayıklama derlemesiydi. Her ikisi de nominal olarak 1.8.1 sürümüydü, ancak GitHub kodunun proje ayarları derleme adını BouncyCastle olarak ayarlarken, NuGet paketi BouncyCastle.Crypto derleme adına sahipti. Proje ayarlarının değiştirilmesi, böylece montaj adlarının hizalanması sorunu çözdü.


1
Cevabınızı nasıl düzelttiğinizi de açıklayarak daha yararlı hale getirmenizi öneririm.
Stephen Kennedy

0

Benzer bir sorunum var ve RuntimeFrameworkVersion'ı kaldırıyorum ve sorun düzeltildi.

1.1.1'i kaldırmayı deneyin veya


0

Bu sorunu, mevcut projeleri kullanan yeni oluşturulmuş bir çözümde yaşadım. Bazı nedenlerden dolayı, bir proje diğer tüm projelerle aynı referansa sahip olmasına ve referans alınan proje de inşa edilmesine rağmen diğer bir projeyi "göremiyordu". Birden çok hedef çerçeveyle ilgili bir şeyi tespit edemediğinden şüpheleniyorum, çünkü bir çerçevede kuruluyorken diğerinde değil.

Temizleme ve yeniden oluşturma işe yaramadı ve VS'yi yeniden başlatmak işe yaramadı.

Sonuçta işe yarayan şey, "VS 2019 için Geliştirici Komut İstemi" açmak ve ardından bir msbuild MySolution.slnkomut vermekti . Bu başarıyla tamamlandı ve daha sonra VS de başarıyla inşa etmeye başladı.


-3

Çözümünüzü temizleyin ve yeniden oluşturma benim için çalıştı (Visual Studio'da, bunlar çözüm gezgininize sağ tıkladığınızda aldığınız seçeneklerdir), projemde hata gider.

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.