C++ cli 是否可以导出C++;与MEF和Prism的CLI接口 我有一个C++库中定义的C++接口(用/CLR开关编译) 我还有一个C#library

C++ cli 是否可以导出C++;与MEF和Prism的CLI接口 我有一个C++库中定义的C++接口(用/CLR开关编译) 我还有一个C#library,c++-cli,prism,mef,C++ Cli,Prism,Mef,我的C#库定义: -实现IModule接口的类。 -实现C++/CLI接口并用属性修饰的类 C#和C++\CLI库都部署在同一个文件夹中 我从Prism得到一个ModuleLoadException,说它找不到我的C++/CLI程序集或它的一个依赖项 如果我用.NET程序集替换C++/CLI程序集,一切都会正常工作 那么,我的问题是,是否可以导出一个实现了C++\CLI接口且导出类型为该接口的类 为什么要在C++/CLI库中定义接口?我希望我们能继承的C++ DLL实际上可以在C++的CLI库中

我的C#库定义: -实现IModule接口的类。 -实现C++/CLI接口并用属性修饰的类

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

我从Prism得到一个ModuleLoadException,说它找不到我的C++/CLI程序集或它的一个依赖项

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

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

为什么要在C++/CLI库中定义接口?我希望我们能继承的C++ DLL实际上可以在C++的CLI库中定义它们的契约,并有C类库引用契约DLL。
也许我的方法是错误的,如果您认为有更好的方法来实现这一点,请告诉我。

我以前没有花太多时间使用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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel.Composition.Hosting;
使用System.Linq;
使用系统文本;
使用CPPMEF_CPP;
命名空间CPPMEF_CSharp
{
班级计划
{
静态void Main(字符串[]参数)
{
var catalog=新的AssemblyCatalog(typeof(Program).Assembly);
var容器=新的合成容器(目录);
var logger=container.GetExportedValue();
logger.Log(“测试”);
Console.ReadKey();
}
}
公共类控制台记录器:ILogger
{
公共作废日志(对象obj)
{
控制台写入线(obj);
}
}
}
对于部署C++/CLI程序集,应该没有特殊要求,因为无论如何,部署时都是一样的。是否可以检查C++/CLI程序集是否也部署了任何依赖项