참조되지 않는 어셈블리에 형식이 정의되어 있습니다. 원인을 찾는 방법은 무엇입니까?


83

나는 오류 메시지가 일반적 이며이 오류에 대해 많은 질문이 있다는 것을 알고 있지만 지금까지 해결책이 없었으므로 질문하기로 결정했습니다. 대부분의 유사한 질문과 다른 점은 App_Code 디렉토리를 사용한다는 것입니다.

에러 메시지:

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'.

소스 파일:

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

제안에 따라 여기여기에 , 나는 C 내부 Project.Rights.dll의 모든 인스턴스를 삭제 한 : \ 윈도우 \ Microsoft.NET /*.*에 따르면 , 내가 확인 문제 .cs 파일은 "컴파일"로 빌드 액션 세트가있는 경우 . 그들이하다. 또한 "Project.Rights.OperationsProvider"유형이 포함 된 .cs 파일이 App_Code 디렉터리에 배포되어 있는지 다시 확인했습니다.

어떤 이유로 애플리케이션이 App_Code 디렉토리에서 유형을 찾지 않습니다. 내가 알고있는 Project.Rights.dll의 모든 인스턴스를 삭제했기 때문에 오류 메시지에 어떤 어셈블리가 언급되어 있는지 모르겠습니다.


6
Project.Rights.OperationsProvider 유형의 메서드 / 속성 / 무언가를 노출 하는 클래스 ( A 라고합시다)를 사용하고 있습니다. 컴파일러는 그것이 무엇인지 알아야하고 그 어셈블리 (Project.Rights)를 검색합니다. (웹 사이트 프로젝트에 참조가 없기 때문에) 찾을 수없는 경우이 오류가 발생합니다. 해결책 : 시스템에서 해당 어셈블리를 제거하지 마십시오 !!! 그것에 대한 참조를 추가하십시오.
Adriano Repetti

2
도구-옵션-프로젝트 및 솔루션-빌드 및 실행-두 가지 세부 정보를 모두 세부 정보로 설정하십시오. 그러면 종속성이 무엇이며 컴파일러가 찾는 위치를 알 수 있습니다.
danludwig

답변:


100

이 오류가 발생하면 무슨 일이 일어나고 있는지 항상 분명하지는 않지만 오류가 말했듯이 참조가 누락되었습니다. 다음 코드 줄을 예로 들어 보겠습니다.

MyObjectType a = new MyObjectType("parameter");

간단 해 보이며 "MyObjectType"을 올바르게 참조했을 것입니다. 그러나 "MyObjectType"생성자에 대한 오버로드 중 하나가 참조하지 않은 유형을 취한다고 가정 해 보겠습니다. 예를 들어 다음과 같이 정의 된 과부하가 있습니다.

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

이 오류가 발생하는 적어도 한 가지 경우입니다. 따라서 유형을 참조했지만 해당 유형에서 호출되는 함수에 대해 가능한 모든 유형의 속성 또는 메서드 매개 변수가 아닌이 유형의 패턴을 찾으십시오.

바라건대 이것은 적어도 올바른 방향으로 나아가는 데 도움이됩니다!


16
확장 메서드에 대한 참고 : 두 클래스에 같은 이름의 확장 메서드가있는 경우 한 유형의 매개 변수가 다른 유형의 확장 메서드 사용을 "감염"시킬 수 있습니다.
Athari

@Athari은 그 알아 낸 못했네, 감사합니다
데이브 Cousineau

잠시 후이 대답을 찾았습니다. 이것은 정확히 내 문제이며 귀하의 설명은 매우 도움이되었습니다. 감사합니다.
Diane

1
하지만 참조와 함께 생성자를 사용하지 않으려면 어떻게해야합니까? 참조를 추가하지 않고 다른 것을 사용하고 싶습니다. 이것이 가능할 것 같습니다.
Robert Iagar

1
이것은 정말 이상해 보이지만 어셈블리 이름 중 하나의 경우에 불일치가 발생했기 때문에이 오류가 발생했습니다 (너겟이 대소 문자를 구분 한 것처럼 보입니까?)! 라이브러리 C 참조 라이브러리 B와 A가 있습니다. 라이브러리 B도 라이브러리 A를 참조했지만 A를 'A'대신 'a'라는 이름을 사용하여 종속성으로 패키지했습니다. 라이브러리 C를 빌드 할 때 B에서 종속성 이름을 수정할 때까지이 오류가 계속 발생했습니다!
Tolu

49

프로젝트에서 대상 프레임 워크를 확인하십시오.

필자의 경우 "어셈블리에 대한 참조를 추가해야합니다"는 실제로 호출자와 참조 프로젝트에 동일한 대상 프레임 워크가 없다는 것을 의미합니다. 호출자 프로젝트에는 .Net 4.5가 있지만 참조 된 라이브러리에는 대상 4.6.1이 있습니다.

나는 MS 컴파일러가 더 똑똑하고 더 의미있는 오류 메시지를 기록 할 수 있다고 확신합니다. https://github.com/dotnet/roslyn/issues/14756에 제안을 추가했습니다.


16

NuGet 패키지 업데이트를 수행하는 것은 단지에 DLL 의존성에 대한 참조를 업데이트했기 때문에 내 경우에는이 있었다 일부 하지만 모든되지 버전 충돌의 결과 - 내 솔루션에 프로젝트를. grep 스타일 도구 를 사용 하여 내 솔루션의 * .csproj 파일 내에서 텍스트를 검색하면 업데이트가 필요한 프로젝트를 쉽게 확인할 수있었습니다.


이 답변에 감사드립니다-나는 이것이 이것에 가까운 것이라고 생각했지만 그것을 보게되어 기뻤습니다. 다시 말하면 데이터 영역에서 선택적 매개 변수를 사용하여 생성자를 호출하는 상위 프로젝트 (서비스)는 해당 참조가 .csproj에 추가되지 않았습니다. 하위 및 상위 .csproj 파일을 비교하면 상위에 있어야하는 ItemGroup이 표시되어야합니다.
Ryanman 2017-10-23

3
솔루션에 대한 Visual Studio 패키지 관리자 창 (개별 프로젝트 용이 아님)에는 서로 다른 프로젝트에서 다른 버전이있는 패키지를 보여주는 통합 탭이 있습니다. grep 같은 도구보다 낫다
Michael Freidgeim

7

이 오류가 발생하면 사용중인 코드가 어셈블리에있는 형식을 참조하지만 어셈블리가 프로젝트의 일부가 아니므로 사용할 수 없음을 의미합니다.

Project.Rights.dll을 삭제하는 것은 원하는 것과 반대입니다. 프로젝트에서 어셈블리를 참조 할 수 있는지 확인해야합니다. 따라서 전역 어셈블리 캐시 또는 웹 응용 프로그램의 ~ / Bin 디렉터리에 있어야합니다.

편집-어셈블리를 사용하지 않으려면 삭제하는 것도 적절한 해결책이 아닙니다. 대신 코드에서 이에 대한 모든 참조를 제거해야합니다. 어셈블리는 작성한 코드에 의해 직접 필요하지 않고 대신 참조하는 다른 항목에 의해 필요하므로 참조 된 어셈블리를 종속성으로 Project.Rights.dll이없는 것으로 대체해야합니다.


2
어셈블리를 사용할 수 없습니다. 그것은 요구 사항입니다. 나는 그것을 제거하고 App_Code 디렉토리 안에 클래스를 저장해야합니다. 나는 그것이 어떻게 들리는 지 압니다. 모든 비즈니스 로직이 DLL 대신 App_Code에 저장되도록 응용 프로그램을 변경하는 작업은 재미가 없습니다.
afaf12

1
아니요, 그것은 그가 그것을 참조하여 무언가를 사용하고 있다는 것을 의미합니다 (그가 직접 사용하고있는 것이 아닙니다). @ afaf12를 제거해야하는 경우 ... 누가 그것을 사용하고 있는지 확인해야 합니다 ( 간접 참조 로 상상해보십시오 ). 단순히 App_Code 디렉터리에 코드를 붙여 넣을 수는 없습니다. 컴파일 된 어셈블리는 여전히 원본 (및 외부) 어셈블리를 참조합니다.
Adriano

나는 비슷한 것을 가지고 있었고 귀하의 게시물은 많은 도움이되었습니다. 제 경우에는 어셈블리 "A"를 참조했습니다. 이 어셈블리는 다른 어셈블리 "B"를 사용하고 있습니다. 내 프로젝트에 추가했지만 어셈블리 "B"가 누락되었다는 오류가 계속 발생했습니다. 어셈블리 "B"를 내 bin 디렉토리에 복사하면 문제가 해결되었습니다. 그 이유는 내 프로젝트가 어셈블리 "B"를 사용하지 않고 어셈블리 "A"가 사용 중이 어서 발견하지 못해 예외가 발생했기 때문입니다. 감사.
ykh

4

제 경우에는 잘못된 플랫폼 / 구성으로 빌드중인 라이브러리를 참조하고있었습니다 (방금 참조 된 라이브러리를 생성했습니다).

또한 Visual Studio Configuration Manager에서 문제를 해결할 수 없었습니다.이 라이브러리에 대한 새 플랫폼 및 구성을 전환하고 만들 수 없었습니다. 해당 프로젝트 ProjectConfigurationPlatforms에 대한 .sln파일 섹션의 항목을 수정하여 수정했습니다 . 모든 순열은 Debug|Any CPU(내가 어떻게했는지 잘 모르겠습니다) 로 설정되었습니다 . 깨진 프로젝트의 항목을 작업 프로젝트의 항목으로 덮어 쓰고 각 항목의 GUID를 변경했습니다.

작동하는 프로젝트에 대한 항목

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

손상된 프로젝트 항목

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

이제 손상된 항목이 수정되었습니다.

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

누군가에게 도움이되기를 바랍니다.


저에게는 비슷했습니다. VIsual Studio는 일부 프로젝트의 GUID를 FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #)에서 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET)으로 변경했습니다. 내가 그들을 되 돌린 후에 모든 것이 잘되었습니다.
scor4er

3

다른 프로젝트가 동일한 dll의 다른 사본을 참조하고 있다는 사실이 나에게 일어났습니다. 모두 디스크에서 동일한 파일을 참조했는지 확인했고 예상대로 오류가 사라졌습니다.


1

.NET 어셈블리 탭에서 참조를 추가하려고 할 때 작동하지 않았습니다. 그러나 C : \ Windows \ Microsoft.NET \ Framework \ v4.0.30319에 BROWSE를 사용 하여 참조를 추가하면 작동했습니다 .


0

주된 이유 중 하나는 당신이 전에 어떤 일을 수행해야합니다 DLL의 속성이 확인 될 수 specific version property있다면 진정한 메이크업이 거짓을

이유 : 빌드 할 때 소스 코드가 다른 (이전) 버전과 결합되었을 수 있지만,이 라이브러리는 새 업데이트로 업그레이드되어 이제 Assembly Cash에서 버전이 다르고 응용 프로그램이 새 DLL을 얻을 specific version property수 없으며 비활성화 한 후에 는 applacaten이 무료로 제공됩니다. 새 버전의 DLL 참조를 얻으려면


0

사용중인 라이브러리 (DLL 파일)에 다른 라이브러리가 필요할 수 있습니다. 제 경우에는 데이터베이스 엔티티 모델이 포함 된 라이브러리를 참조했지만 엔티티 프레임 워크 라이브러리를 참조하는 것을 잊었습니다.


0

이것은 또한 라이브러리에 정의 된 (공용) 유형을 노출하는 라이브러리를 사용함을 의미 할 수도 있습니다. 라이브러리 (빌드하지 않는 라이브러리)에서 특별히 사용하지 않는 경우에도 마찬가지 입니다.

이것이 막을 수있는 것은 사용할 수없는 클래스 (서명에 참조되지 않은 라이브러리의 유형이 있음)를 사용하는 코드를 작성하는 것입니다.


0

나에게 오류가 발생한 이유는 오류가보고 된 WebForm이 다른 폴더에서 이동되었지만 코드 파일 클래스의 이름은 변경되지 않고 실제 경로와 일치하지 않기 때문입니다.

초기 상태 :
원래 파일 경로 : /Folder1/Subfolder1/MyWebForm.aspx.cs 원래 코드 파일
클래스 이름 : Folder1_Subfolder1_MyWebForm

파일을 이동 한 후 :
파일 경로 : /Folder1/MyWebForm.aspx.cs 코드 파일
클래스 이름 (변경되지 않고 오류가 표시됨) : Folder1_Subfolder1_MyWebForm

이 솔루션은 :
이름 바꾸기 당신의 codefile 클래스 Folder1_Subfolder1_MyWebForm
하나 해당 으로 새 경로 :Folder1_MyWebForm

한 번에-문제 해결, 오류보고 없음 ..


0

'Domain.tblUser'형식이 참조되지 않는 어셈블리에 정의되어 있습니다. 어셈블리 'Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'에 대한 참조를 추가해야합니다.

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

참고 : DI 컨테이너에 따라 참조가 올바른지 확인하십시오.


0

제 경우에는

암시 적 연산자

사이 BLLDAL내가 사용하려는 classes.when BLL응용 계층에서 계층이 오류를 얻었다. 나는 변했다

암시 적 연산자

...에

명시 적 연산자

괜찮습니다. 감사


0

제 경우에는 참조 된 dll 버전이 실제로 이전에 사용했던 버전보다 더 최신 버전이었습니다.

이전 릴리스로 롤백하기 만하면 문제가 해결되었습니다.


0

나에게 이것은 다른 어셈블리 이름을 가진 두 개의 다른 Bouncy Castle 빌드를 참조하는 프로젝트에서 직접 및 간접적으로 (다른 종속성을 통해) 발생했습니다. Bouncy Castle 빌드 중 하나는 NuGet 패키지 였고, 다른 하나는 GitHub에서 다운로드 한 소스의 디버그 빌드였습니다. 둘 다 명목상 버전 1.8.1 이었지만 GitHub 코드의 프로젝트 설정은 어셈블리 이름을 BouncyCastle로 설정 한 반면 NuGet 패키지의 어셈블리 이름은 BouncyCastle.Crypto입니다. 프로젝트 설정을 변경하여 어셈블리 이름을 정렬하면 문제가 해결되었습니다.


1
어떻게 수정했는지 설명하여 답변을 더 유용하게 만들 수 있습니다.
Stephen Kennedy

0

비슷한 문제가 있으며 RuntimeFrameworkVersion을 제거하고 문제가 해결되었습니다.

1.1.1을 제거하거나


0

기존 프로젝트를 사용하여 새로 만든 솔루션에서이 문제가 발생했습니다. 어떤 이유로 한 프로젝트는 다른 모든 프로젝트와 동일한 참조를 가지고 있어도 다른 하나의 프로젝트를 "볼"수 없었고 참조 된 프로젝트도 구축 중이었습니다. 하나의 프레임 워크에서 빌드되었지만 다른 프레임 워크에서는 빌드되지 않았기 때문에 여러 대상 프레임 워크와 관련된 것을 감지하지 못한 것 같습니다.

청소 및 재 구축이 작동하지 않았고 VS를 다시 시작해도 작동하지 않았습니다.

결국 작동하게 된 것은 "VS 2019 용 개발자 명령 프롬프트"를 열고 명령을 내리는 것이 었습니다 msbuild MySolution.sln. 이것은 성공적으로 완료되었으며 이후 VS도 성공적으로 구축하기 시작했습니다.


-3

솔루션을 정리하고 다시 빌드하면 (Visual Studio에서는 솔루션 탐색기에서 마우스 오른쪽 단추를 클릭하면 표시되는 옵션 임) 오류가 내 프로젝트에서 사라집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.