문제

내 C# 프로젝트(SuperUI라고 부르겠습니다)는 외부 어셈블리의 클래스를 사용하는 데 사용됩니다.이제는 그렇지 않지만 컴파일러에서는 어셈블리 참조가 없으면 프로젝트를 빌드할 수 없습니다.자세히 설명하겠습니다.

이 프로젝트는 사용자 정의 예외 클래스를 발생시키고 포착하는 데 사용되었습니다. SuperException - 표준 System.Exception에서 파생되었으며 별도의 사전 컴파일된 어셈블리에 존재했습니다. SuperAssembly.DLL, 내가 참조한 것입니다.

결국 나는 이것이 무의미한 운동이라고 판단하고 모든 것을 교체했습니다. SuperExceptions 각 경우에 System.SuitableStandardException을 사용합니다.다음에 대한 참조를 제거했습니다. SuperException.DLL, 그러나 이제 프로젝트를 컴파일하려고 할 때 다음과 같은 문제를 만났습니다.

참조되지 않은 어셈블리에 'SuperException' 유형이 정의되어 있습니다.'SuperException, Version=1.1.0.0 (...)' 어셈블리에 대한 참조를 추가해야 합니다.

오류에서 참조한 소스 파일은 관련성이 없는 것 같습니다.IDE에서 강조 표시되는 것은 프로젝트 네임스페이스입니다.

이제 문제는 다음과 같습니다.

  1. 모든 용도 SuperException 프로젝트 코드에서 제거되었습니다.
  2. 참조 없이 잘 컴파일되는 다른 프로젝트와 비교하면 SuperException.DLL, 저는 어셈블리를 하나만 더 참조합니다. that 내 프로젝트가 자체적으로 참조하지 않는 것은 아무것도 참조하지 않습니다.이러한 종속성 중 하나라도 오류가 발생할 수 있지만 SuperExceptions, 나는 기본 Exception 클래스만 포착하고 있으며 어떤 경우에도...다른 프로젝트는 잘 빌드됩니다!
  3. 저는 Visual Studio의 "클린 솔루션"을 수행하고 모든 것을 수동으로 여러 번 지웠습니다.

이 참조를 포함하는 것이 세상의 끝은 아닙니다. 더 이상 필요한 이유를 모르겠습니다.안돼.어떤 조언이라도 환영합니다!

도움이 되었습니까?

해결책

일부 유형 메서드 호출이 SuperException 박스형("다운캐스트") 인스턴스를 반환하는 전이적 참조일 가능성이 높습니다.예외는 있지만 전이적으로 포함된 코드의 코드를 검사하는 것입니다.외부 메서드 호출의 코드를 사용하면 컴파일러는 어느 시점에서 해당 유형에 대한 정보를 가질 수 있어야 한다는 것을 알고 있습니다.

Resharper는 참조를 추가해야 하는 경우를 알려주며 Lütz Roeder의 RedGate's Reflector를 사용하여 컴파일된 IL을 스캔하여 이 유형에 대한 참조를 두 가지 방법으로 검색할 수 있습니다.1) 검색 기능을 사용하고, 2) 사용 중인 각 공개 유형을 열고 "고스트" 어셈블리가 필요한 공개 유형의 경우 해당 위치를 지정하라는 메시지가 표시됩니다.

이것은 Castle.Windsor를 참조하지만 Castle.MicroKernel을 참조하지 않을 때 가장 자주 발생합니다.:피

다른 팁

  1. Visual Studio 종료
  2. 솔루션 디렉터리에서 bin 및 obj 폴더를 삭제합니다.
  3. 다시 시작하고 무슨 일이 일어나는지 확인하세요

여기 다른 댓글들에도 동의해요..일반 텍스트로 된 참조가 있습니다. 어딘가에 !과거에 프로젝트 파일을 검색해도 아무 것도 반환되지 않는 비슷한 문제가 있었는데, 검색에서 자동으로 선택되지 않은 다른 파일에 있었던 것으로 나타났습니다.

새 프로젝트를 만드는 것이 여기서 해결책이라고 생각하지 않습니다.당신은 그것을 긍정적으로 생각해야합니다 없음 종속성 트리의 참조 중 SuperException을 사용합니다. 없음

나는 말 그대로 프로젝트를 지워야 할 정도로 이런 일을 경험한 적이 없으며 항상 어딘가에서 참조를 찾았습니다.검색 중인지 확인하세요. 모든 파일.

편집하다:

추가할 점은 오류가 가리키는 위치가 무작위로 보이는 경우 컴파일된 소스와 소스 코드 파일이 일치하지 않는다는 의미일 수 있다는 것입니다.이것은 ASP.NET 응용 프로그램입니까?ASP.NET 임시 폴더를 다시 빌드할 때 컴파일된 DLL이 교체되지 않아 문제가 발생한 적이 있습니다.디버깅할 때 흥미롭습니다 :)

나는 이것이 코드 문제라고 생각하지 않습니다.내가 볼 수 있는 것은 기존 참조 중 하나가 아마도 애플리케이션에서 생성 중인 자체 유형의 해당 유형에 의존한다는 것입니다.

이 경우 형식을 명시적으로 사용하지 않고 참조된 다른 어셈블리에 자체 참조가 있더라도 해당 참조가 필요합니다.참조하지 않은 유형에 대한 참조가 필요한 타사 구성 요소에서 이러한 문제가 발생하는 경우가 있습니다.컴파일러는 분명히 기존 참조 어셈블리 중 하나에서 무언가를 보고 있으며 사용자가 종속 어셈블리를 참조할 것으로 기대하고 있습니다.

컴파일러 오류이므로 프로젝트 어딘가에 SuperException에 대한 참조나 사용이 있어야 합니다.

  1. 해당 유형에 대한 전체 프로젝트 또는 솔루션에서 찾기/바꾸기를 수행하고 모든 참조를 제거합니다(이미 수행했을 수도 있음).
  2. SuperException에서 상속되는 형식을 참조하는 경우(해당 형식이 다른 어셈블리에 정의된 경우에도) SuperException이 정의된 어셈블리에 대한 참조가 필요합니다.

컴파일러가 오류를 표시하는 줄을 선택하고 해당 줄에서 사용된 개체의 상속 트리 추적을 시작하면 해당 방법으로 소스를 찾을 수 있습니다.

지금까지 답변해 주셔서 감사합니다.나는 모든 제안(하나 제외)을 시도했지만 소용이 없었습니다.

내가 시도하지 않은 제안은 새 프로젝트를 만들고 여기에 내 모든 것을 추가하는 것입니다. 그 생각은 실제로 내 삶의 의지를 테스트합니다.;) 귀찮다면 내일 이것을 시도해 볼 수도 있습니다.다시 한 번 감사드립니다.

요즘 VS 프로젝트에 대해 그다지 신비한 것은 없습니다. 모두 텍스트 파일 등입니다.SOMETHING은 해당 클래스/dll을 참조해야 하며 해당 무언가는 프로젝트의 일부여야 합니다.

전체 솔루션 트리를 실제로 grep'd 또는 findstr'd했습니까? 파일 하나하나, 해당 예외에 대한 참조는 무엇입니까?

꽤 이상하게 들립니다.다음에 확인해 볼 내용은 다음과 같습니다.

  1. Properties/AssemblyInfo.cs 파일에 아무것도 남아 있지 않은지 확인하세요.
  2. SuperUI.csproj 파일에 아무것도 남아 있지 않은지 확인하세요.
  3. 모든 참조를 삭제하고 다시 추가하십시오.

새 프로젝트를 만들고 여기에 모든 클래스를 추가해 보세요.

프로젝트 폴더를 grep하십시오.프로젝트의 숨겨진 참조일 수도 있고 프로젝트에서 참조하는 프로젝트일 수도 있습니다.필요한 경우 메모장으로 정리하세요.

SuperException에서 상속되는 형식을 참조하는 경우(해당 형식이 다른 어셈블리에 정의된 경우에도) SuperException이 정의된 어셈블리에 대한 참조가 필요합니다.

그것에 동의했습니다.

참조하지 않을 수도 있습니다. SuperException, 하지만 당신이 언급하고 있을 수도 있습니다 SpecializedSuperException, 에서 파생되거나 다른 방식으로 사용됩니다. SuperException - 프로젝트의 grep SuperException 그래도 안 잡히겠지.

시험판으로 해킹해 보세요. N종속

이것은 다음과 같은 도구가 있는 곳입니다. 리샤퍼 정말 좋은 결과를 얻었습니다. 간단한 Find Usages를 사용하면 일반적으로 이러한 "유령 종속성"에 대해 여러 번 알 수 있습니다.

SuperException 클래스 정의로 이동하여 모든 참조() 찾기를 시도해 볼 수도 있습니다.SuperException 어셈블리에 다음이 있는지 조사할 수도 있습니다. 순환 의존성 주 조립품에서(예: 주 조립품은 예외적으로 조립품에 따라 달라집니다...)

내 C# 라이브러리에 종속 C++/CLI 어셈블리가 있을 때 발생하는 매우 유사한 어셈블리 참조 문제가 있었습니다.문제는 C# 어셈블리 라이브러리의 C++/CLI 어셈블리에서 공용 클래스를 상속한다는 것이었습니다.이는 상속 체인이 여러 어셈블리에 걸쳐 있음을 의미합니다.

저는 모든 클라이언트가 C# 라이브러리가 필요할 때마다 C++/CLI 어셈블리를 간접적으로 로드할 수 있을 만큼 똑똑하기를 바랐지만 컴파일 타임에도 그렇지 않았습니다.

두 어셈블리 라이브러리에 걸쳐 있는 클래스 간의 상속을 중단하고 대신 집계를 사용하여 이 문제를 제거했습니다.내 고객은 마침내 만족했고 더 이상 C++/CLI 어셈블리를 종속성으로 요구하지 않았습니다.

당신의 말로 당신은 아마도 그것을 확인해야 할 것입니다 SuitableStandardException 상속받지 않습니다. SuperException 을 제거하기 위해 SuperException.DLL 참고로.

상속 대신 캡슐화를 사용하고 SuperException 새 데이터 멤버 SuitableStandardException.

그래도 문제가 해결되지 않으면 일부 어셈블리에서 상속을 포괄하는 더 많은 클래스가 있을 수 있습니다. SuperAssembly.DLL 그리고 superException.dll.

모두 찾을 수 없다면 다음 방법을 시도해 보세요.

  1. 모든 공개 멤버와 클래스를 SuperAssembly.DLL 내부.

  2. SuperAssembly.DLL에서 친구를 사귀세요 SuperException.DLL:

    [assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
    
  3. 그들이 빌드하고 제거하는지 확인하십시오. SuperAssembly.DLL 이미 참조하는 클라이언트의 참조 SuperException.DLL.

grep -R SuperException * 프로젝트 기반에서 (가져오기 grep 어딘가에서 먼저) 확실히 하기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top