2009-07-07 4 views
5

문제점 : C++ CLI로 작성된 DLL 인 myCli.dll에 대한 종속성이있는 WinForms 컨트롤 ('MyControl')이 있습니다. 이 구성 요소는 제 3 자입니다 (다른 팀이 작성). myCli.dll은 아직 다른 당사자가 작성한 myLibrary.dll에 대한 종속성이 있습니다. 컨트롤은 C# 컨트롤 및 리소스 라이브러리 인 myAssembly.dll에 있습니다.해결되지 않은 종속성으로 인해 Winforms 컨트롤을 사용할 수 없습니다.

myCli.dll에 myLibrary.dll에 대한 의존성이 없을 때이 컨트롤을 훌륭하게 작동 시켰습니다. 폼에 추가하고 빌드 할 수 있습니다. 그러나 새로운 버전의 myCli.dll이 나왔고 다시 연결되었습니다. 갑자기 IDE가 잘못 작동합니다. 핵심 문제는 IDE가 myLibrary.dll에 대한 myCli.dll 종속성을 해결할 수 없다는 것입니다.

"Failed to create component 'MyControl'. 

오류 메시지는 다음과 같습니다 : 나는 디자인 화면에 도구 상자에서 컨트롤을 드래그 할 때

, 나는 오류가

'System.IO.FileNotFoundException: Could not load file or assembly 'myCli.dll, Version 0.0.0.0, Culture=neutral, PublicKeyToken=2fb8da784abc560a' or one of its dependencies. 
The system cannot find the file specified" 

나의 신념이다 내가 할 수있는 경우에 그 myLibrary.dll을 어디에 둘 것인지 알아 내면 참조 문제가 해결됩니다. 나는 이것을 확실히 모른다. 누군가가 문제를 해결하기 위해 무엇을해야하는지 알고 있습니까?

답변

0

나는 DLL이 프로젝트 디렉토리에 들어가서 빌드시 출력 디렉토리에 복사되도록 설정해야한다고 생각한다. 시스템이 그것을 찾을 수 있어야합니다 -

디자이너 지원에 대한
+0

나는 그것을 시도했다. 그것은 작동하지 않았다 – MedicineMan

0

, 나는 myCLI.dll이 존재하거나 C:\Windows\System32에 복사 시도 할 수있는 곳 myLibrary.dll이 (myCLI.dll 또한이 살고 있다고 가정) C:\Program Files\Visual Studio xxx\Common7\IDE\PublicAssemblies로 이동하거나 장소에 있어야 하나 생각 그때.

또한 프로젝트에 추가해야하며 Clippit '98에서 제안한대로 "항상 복사"로 설정하십시오.

0

적절한 장소를 찾는 또 다른 방법은 Process Monitor 일 것입니다. dll에 대한 출력을 필터링하고 파일을 검색하는 경로를 확인하십시오.

0

myCli.dll 및 모든 종속성이 동일한 폴더에 있어야합니다. 그렇지 않으면 VS가 해당 폴더를 찾을 수 없습니다.

가장 쉬운 방법은 myCli.dll을 빌드 할 때 모든 파일을 Debug/Release 폴더에 복사 한 다음 프로젝트의 해당 컨트롤을 Debug/Release 폴더에서 참조하는 것입니다 직접.

1

내 경우에는 초기화 및 Form_Load 내 코드 DLL 참조에 따라 다른 프로젝트에 대한 호출이 포함되어 있습니다.

if (!DesignMode) 
{ 
    //add your initializing code (for runtime!) here 
} 

이 코드를 제외하면 내가 디자인 타임에 컨트롤을 추가 할 수 있었다.

0

HTH 나는이 오래된 스레드 알지만, 그냥 내 정확한 문제를 해결하기 위해 무엇을 사용에 차임.

필자는이 문제의 Peter Rakké 솔루션을 처음에 사용했습니다 (https://stackoverflow.com/a/15077337/34440). 그러나 그것은 내 평범한 패턴을 변화시키는 이상적인 것이 아닙니다.

내 C++/CLI는 실행시 기본 DLL의 함수 만 사용하고 자체 인터페이스 정보가 포함되어 있으므로 지연된 기본 DLL로 변경했습니다. Visual Studio (프로젝트 속성 -> 구성 속성 -> 링커 -> 입력 -> 지연로드 된 DLL) 프로젝트 설정에서 두 원시 DLL을 추가했습니다. 속성 대화 상자의 맨 위에있는 구성 및 플랫폼 드롭 다운을 모두 옵션으로 설정하고 완전히 다시 작성하십시오.

그런 다음 내 중첩 제어 및 양식의 C++/CLI DLL에서 유형을 참조 할 수있었습니다.

+0

신 그들이 끔찍한 시간은 그 것이었다. 다행스럽게도 나는 그 쓰레기를 더 이상 할 필요가 없기 때문에 기쁘다. – MedicineMan

0

MedicineMan과 같은 상황. WinForms 프로젝트는 libraryA.dll에 2 개의 다른 구성 요소를 사용하며, 차례로 libraryB.dll에 종속됩니다. 나를 위해 일한

솔루션 (단지 모든 라이브러리를 디버그 모드에서 내장 경우에도, 모든 프로젝트에 적용 할 수있는 DLL을 참조하고, 수동으로 다른 폴더에 DLL을 복사하지 않고) :

  1. libraryA에서 구성 요소의 경우. 공용 속성이 libraryB.dll에서 유형을 사용하여와 libraryA.dll에서 구성 요소의

    If Me.DesignMode Then Exit Sub 
    
  2. 는, 사용 (주의 구문을 확인 디자이너에서 이러한 속성을 숨기기 속성 : 그 재정이 종료 디자인 타임 모드의 경우, 이벤트를 그릴 dll을 - 나는) 어떤 이상한 맞춤법/변화가 여러 가지 다른 게시물을 본 적이 :

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> 
    
  3. 재 빌드 구성 요소는 다음 윈폼 프로젝트에 사용하기 전에 Visual Studio를 다시 시작합니다. 어떤 이유로 인해 동일한 세션에서 속성의 변경 사항이 감지되지 않으며 명백한 시도를하기 전에 몇 시간의 불을 탔습니다.

여전히 문제가 발생하는 경우, 바인딩 구성 요소 중에 디버깅 정보를 얻기에 좋은 포스트가있다 (즉, 당신이 폼으로 구성 요소를 놓기 드래그 할 때) : How to enable assembly bind failure logging (Fusion) in .NET (마이크 Goatly으로 답변을 아래로 스크롤) .

행운을 빈다.

관련 문제