是否可以使用MEF和Prism导出C ++ CLI接口

时间:2011-08-18 19:35:26

标签: c++-cli prism mef

我在C ++库中定义了C ++ / CLI接口(使用/ clr开关编译) 我也有一个C#库。

我的C#库定义:   - 实现Prism IModule接口的类。   - 实现C ++ / CLI接口的类,并使用MEF Export属性进行修饰。

C#和C ++ \ CLI库都部署在同一个文件夹中。

我从Prism那里得到一个ModuleLoadException,说它无法找到我的C ++ / CLI程序集或其依赖项之一。

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

我的问题是,是否可以导出一个实现C ++ \ CLI接口的类,导出类型是该接口?

为什么我在C ++ / CLI库中定义了接口?我希望我们拥有的遗留C ++ DLL实际上可以在C ++ \ CLI库中定义它们的契约,并让C#库引用该契约dll。 也许我的做法是错误的,如果您认为有更好的方法可以让我知道。

1 个答案:

答案 0 :(得分: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程序集部署了任何依赖项?