programing

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

skycolor 2023. 4. 27. 22:06
반응형

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

오류 메시지가 일반적이고 SO에 이 오류에 대한 질문이 많다는 것을 알지만, 지금까지 저에게 도움이 되는 해결책이 없어서 질문을 하기로 했습니다.대부분의 유사한 질문과 다른 점은 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: 내부의 Rights.dll:\Windows\Microsoft.NET/*.*에 따르면 문제의 .cs 파일에 빌드 작업이 "Compile"로 설정되어 있는지 확인했습니다.그들은 있습니다."프로젝트"가 포함된 .cs 파일도 확인했습니다.Rights.OperationsProvider" 유형이 App_Code 디렉토리에 배포되었습니다.

어떤 이유에서인지 애플리케이션이 App_Code 디렉토리에서 유형을 찾지 않습니다.프로젝트의 모든 인스턴스를 삭제했기 때문입니다.rights.dll(제가 알고 있는 바로는), 오류 메시지가 어떤 어셈블리를 언급하고 있는지 모르겠습니다.

이 오류가 발생하면 무슨 일이 일어나고 있는지 항상 명확하지는 않지만 오류에서 알 수 있듯이 참조가 누락되어 있습니다.다음 코드 행을 예로 들어 보겠습니다.

MyObjectType a = new MyObjectType("parameter");

이 방법은 매우 단순해 보이며 "MyObjectType"을 올바르게 참조했을 수 있습니다.그러나 "MyObjectType" 생성자에 대한 오버로드 중 하나가 참조하지 않은 유형을 사용한다고 가정해 보겠습니다.예를 들어 오버로드는 다음과 같이 정의됩니다.

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

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

적어도 이것이 당신을 올바른 방향으로 가게 해주기를 바랍니다!

프로젝트의 대상 프레임워크를 확인합니다.

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

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

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

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

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

편집 - 어셈블리를 사용하지 않으려면 어셈블리를 삭제하는 것도 적절한 해결 방법이 아닙니다.대신 코드에서 모든 참조를 제거해야 합니다.어셈블리는 작성한 코드에 의해 직접 필요하지 않고 참조 중인 다른 어셈블리에 의해 대신 프로젝트가 없는 어셈블리로 대체해야 합니다.rights.dll을 종속성으로 지정합니다.

제 경우, 잘못된 플랫폼/구성으로 구축된 라이브러리를 참조하고 있었습니다(참조된 라이브러리를 방금 만들었습니다).

또한 Visual Studio Configuration Manager에서 문제를 해결할 수 없습니다. 이 라이브러리에 대한 플랫폼 및 구성을 전환하고 새로 만들 수 없습니다.저는 그는것수수다니정습에 했습니다.ProjectConfigurationPlatforms의한부의 한 .sln해당 프로젝트의 파일입니다.의 모든 은 모든순열다같음설니습다었정되이과은다▁to로 설정되었습니다.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

이것이 누군가에게 도움이 되길 바랍니다.

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

Visual Studio에서 클래스 라이브러리를 언로드하고 다시 로드하면 문제가 해결되었습니다.

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

에서 참조를 추가하려고 할 때 이 작업이 수행되지 않았습니다.NET 어셈블리 탭.그러나 BROW와 함께 참조를 C:에 추가했을 때는 효과가 있었습니다.\Windows\Microsoft.NET 프레임워크\v4.0.30319

기존 프로젝트를 사용하는 새로 생성된 솔루션에서 이 문제가 발생했습니다.어떤 이유로 한 프로젝트가 다른 모든 프로젝트와 동일한 참조를 가지고 있음에도 불구하고 다른 프로젝트를 "확인"할 수 없었고 참조된 프로젝트도 빌드 중이었습니다.저는 그것이 여러 목표 프레임워크와 관련된 것을 감지하지 못했다고 생각합니다. 왜냐하면 그것은 하나의 프레임워크에 구축되었지만 다른 프레임워크에는 구축되지 않았기 때문입니다.

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

한 것은 "개발자 연 "VS 2019 개발자 명령 프롬프트"를 입니다.msbuild MySolution.sln되었고, 이후 도 성공적으로 구축을 이 작업은 성공적으로 완료되었고, 이후 VS도 성공적으로 구축을 시작했습니다.

주요 이유 중 하나는 DLL 속성일 수 있습니다. 확인하기 전에 모든 작업을 수행해야 합니다. 정말이면 거짓으로 만듭니다.

이유: 소스 코드를 빌드할 때 다른 (이전) 버전과 결합된 소스 코드일 수 있지만, 이 라이브러리는 현재 어셈블리 캐시에서 다른 버전으로 업그레이드되었으며 응용 프로그램은 새 DLL을 가져오는 것이 금지되었으며, 사용하지 않도록 설정한 후 응용 프로그램은 새 DLL 참조 버전을 무료로 가져올 수 있습니다.

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

이것은 또한 라이브러리를 사용한다는 것을 의미할 수 있으며, 라이브러리에 정의된 (공개) 유형을 표시합니다.라이브러리(빌드되지 않는 라이브러리)에서 이러한 기능을 특별히 사용하지 않는 경우에도 마찬가지입니다.

이렇게 하면 사용할 수 없는 클래스(서명에 참조되지 않은 라이브러리의 형식이 있음)를 사용하는 코드를 작성할 수 있습니다.

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

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

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

해결책:
코드 파일 클래스 이름 바꾸기Folder1_Subfolder1_MyWebForm
경로에 해당하는 하나:Folder1_MyWebForm

한 번에 문제가 해결되고 오류가 보고가 없습니다.

'Domain.tblUser' 유형은 참조되지 않는 어셈블리에 정의되어 있습니다.'Domain, Version=1.0.0.0, Culture=neutral, PublicKey' 어셈블리에 대한 참조를 추가해야 합니다.Token=proxy'입니다.

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

참고: DI 컨테이너에 따라 참조가 올바른지 확인합니다.

저의 경우, 이것은 제가 사용했기 때문입니다.

암시적 연산자

BLL그리고.DAL.사하싶때을을 사용하고 싶을 때BLL응용 프로그램 계층에서 이 오류가 발생했습니다.나는 변했어요

암묵적 연산자

로.

명시적 연산자

괜찮습니다.감사해요.

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

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

저도 비슷한 문제가 있는데 Runtime Framework Version을 제거했는데 문제가 해결되었습니다.

1.1.1 제거 시도 또는

문제는 프로젝트 중 하나의 출력 유형이 콘솔 응용 프로그램으로 설정되었다는 것입니다.이 문제를 해결하기 위해 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 응용 프로그램 탭을 클릭하고 출력 유형(콘솔 응용 프로그램에서 클래스 라이브러리로)을 변경했습니다.제가 다시 컴파일한 후에 이 오류가 사라졌습니다.

VS 2022년.VS를 닫고 다시 여는 것이 저에게 효과가 있었습니다.

Visual Studio에서는 솔루션 탐색기를 마우스 오른쪽 버튼으로 클릭하면 나타나는 옵션입니다. 이 오류는 프로젝트에서 사라집니다.

언급URL : https://stackoverflow.com/questions/20660999/the-type-is-defined-in-an-assembly-that-is-not-referenced-how-to-find-the-cause

반응형