2017-04-14 20 views
0

우리는 제 3 자 라이브러리와 몇 개의 내부 패키지를 사용하는 WPF 프로젝트를 가지고 있습니다. wpf 프로그래머가 제대로 작동하므로 어셈블리가 올바르게 해석되고 코드가 훌륭하게 작동합니다.
이 프로그램은 시작한 방법에 따라 다른 소스의 데이터를로드 할 수있는 가능성을 제공합니다. 앞에서 언급 한 것처럼 자체적으로 호출하면 모든 것이 훌륭하게 작동하지만 컨트롤러를 제공하고 COM interop으로 등록하여 수행되는 다른 응용 프로그램에서 programm를 호출하면 어셈블리 참조 문제가 발생합니다. com 객체와 조합 된 어셈블리 참조 문제

[Guid("93BC7929-8A5F-43EA-AEAB-38B5034758E5")] 
[ComVisible(true)] 
public class ConnectionController : ControllerBase 
{ 
    public override void Run() 
    { 
     var viewModel = new MainWindowViewModel(); 
     var view = new MainWindow {DataContext = viewModel}; 
     view.Show(); 
    } 
} 

의 WPF programm에 또한 독립형 애플리케이션으로서 제공되기 때문에

, 우리 WPF 라이브러리 예 였을 들어 assemblys 많이 참조하지 않는 다른 프로젝트에 컨트롤러를 이동.

컨트롤러 자체는 더 이상 논리를 유지하지 않으며 일반적으로 com 객체가 제공하는 데이터를 전달하지만 실제로는 다른 프로젝트의 MainWindowViewModel을 인스턴스화하려고 시도하는 것입니다. 컨트롤러와 동일한 솔루션에있는 프로젝트는 올바르게 해석되지만 제 3 자의 작업은 그렇지 않습니다.

컨트롤러에서 wpf programm를 호출하자마자 타사 라이브러리를 참조하는 프로젝트는 더 이상 참조를 확인할 수 없어 예외가 발생합니다.

이런 종류의 문제를 해결하기위한 올바른 방법은 무엇입니까? GAC에 제 3 자 dll을 등록해야합니까? 아니면 우리가 조정해야 할 재산의 일부입니까? 우리는 그것의 주위에 우리의 머리를 얻을 수 없다. 참고 문헌에 대한 모든 정보와 그 정보가 어떻게 해결되었는지 평가 해주십시오.

+0

"다른 응용 프로그램"이 문제입니다. CLR은 여전히 ​​정상적인 방법으로 어셈블리를 찾습니다. 먼저 GAC 다음으로 EXE 파일의 디렉터리입니다. EXE가 관리되는 앱이 아니더라도. [ComVisible] 유형을 가진 DLL 만 등록 할 때/codebase를 사용하면 자동으로 찾을 수 있습니다. 그래서 GAC이 그것을 해결하고 DLL을 다른 앱의 설치 디렉토리에 복사하면 해결됩니다. 기술적으로 AppDomain.AssemblyResolve를 만들 수는 있지만 클라이언트 코드가 항상 먼저 만들어야하는 God 클래스가 있어야합니다. –

+0

@ 한스 패스언트는이 정보가 우리의 문제를 해결하고 그 주제에 대해 더 많은 통찰력을 갖게 해 주신 것에 매우 감사드립니다. 답변으로 의견을 복사/붙여 넣을 수 있습니까? 질문을 대답으로 표시하고 싶습니다. – yRadwan

+0

자신의 게시물에서 사용한 접근 방식을 공유하십시오. 내가 무엇을하기로 결정했는지 짐작할 수 없습니다. 게시물을 답으로 표시하십시오. –

답변

0

@Hans Passant 덕분에 문제의 해결책을 발견했습니다. 첫 번째 시도를 위해 필요한 dll을 실행 어셈블리의 폴더에 복사하고 매력처럼 작동했습니다. 이것은 최종 해결책이 아니며, 대부분 코드베이스를 사용하지만 컨트롤러가 항상 먼저 생성되기 때문에 god 클래스를 사용할 수도 있습니다. 나는 컨트롤러를 가능한 한 작게 유지하려고 노력하고 애플리케이션이 리소스를 얻는 방법을 처리하도록 할 것이라고 생각한다.