2011-08-18 51 views
2

我有一個在C++庫中定義的C++/CLI接口(使用/ clr開關編譯) 我也有一個C#庫。是否可以使用MEF和Prism導出C++ CLI接口

我的C#庫定義了: - 實現Prism IModule接口的類。 - 一個實現C++/CLI接口的類,裝飾着MEFExport屬性。

C#和C++ \ CLI庫都部署到同一個文件夾中。

我得到一個Prism的ModuleLoadException,說它找不到我的C++/CLI程序集或它的一個依賴項。

如果我使用.NET替換C++/CLI程序集,一切正常!

那麼我的問題是,是否有可能導出一個實現了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程序集一起部署?