2011-08-18 1 views
2

C++ 라이브러리에 정의 된 C++/CLI 인터페이스가 있습니다 (/ clr 스위치로 컴파일 됨) 또한 C# 라이브러리가 있습니다.MEF 및 Prism을 사용하여 C++ CLI 인터페이스를 내보낼 수 있습니까?

내 C# 라이브러리는 다음을 정의합니다. - Prism IModule 인터페이스를 구현하는 클래스입니다. - C++/CLI 인터페이스를 구현하고 MEFExport 속성으로 장식 된 클래스입니다.

C# 및 C++ \ CLI 라이브러리는 모두 같은 폴더에 배포됩니다.

프리즘에서 ModuleLoadException이 발생하여 내 C++/CLI 어셈블리 또는 해당 종속성 중 하나를 찾을 수 없다는 메시지가 나타납니다.

C++/CLI 어셈블리를 .NET으로 바꾸면 모든 것이 잘 작동합니다!

그럼 내 질문에 C + \ CLI 인터페이스를 구현하는 클래스를 내보낼 수 있습니까? 내보내기 유형이 해당 인터페이스입니까?

C++/CLI 라이브러리에 인터페이스가 정의되어있는 이유는 무엇입니까? 우리가 가지고있는 레거시 C++ DLL이 C++ \ CLI 라이브러리에서 계약을 정의하고 C# 라이브러리에서 해당 계약 dll을 참조 할 수 있기를 바랬습니다. 어쩌면 내 접근 방식이 잘못되었습니다.이를 달성하는 더 좋은 방법이 있다고 생각되면 알려 주시기 바랍니다.

답변

4

이전에는 C++/CLI와 많은 시간을 보냈지 만 CLS 호환 언어이므로 은 단지으로 작동해야합니다. 여기에 예를

// CPPMEF_CPP.h 

#pragma once 

using namespace System; 
using namespace System::ComponentModel::Composition; 

namespace CPPMEF_CPP { 

    [InheritedExportAttribute] 
    public interface class ILogger 
    { 
    public: 
     virtual void Log(System::Object^ obj) = 0; 
    }; 
} 

그리고 내 C# 콘솔 응용 프로그램에서

입니다 :

using System; 
using System.Collections.Generic; 
using System.ComponentModel.Composition.Hosting; 
using System.Linq; 
using System.Text; 
using CPPMEF_CPP; 

namespace CPPMEF_CSharp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
      var container = new CompositionContainer(catalog); 

      var logger = container.GetExportedValue<ILogger>(); 
      logger.Log("Test"); 

      Console.ReadKey(); 
     } 
    } 

    public class ConsoleLogger : ILogger 
    { 
     public void Log(object obj) 
     { 
      Console.WriteLine(obj); 
     } 
    } 
} 

는 어쨌든 배포 모두 동일합니다으로, C++/CLI 어셈블리를 배포하기위한 특별한 요구 사항이 없어야합니다. C++/CLI 어셈블리에도 의존성이 배치되어 있는지 확인할 수 있습니까?

관련 문제