c++-cli - 是否可以使用 MEF 和 Prism 导出 C++ CLI 接口(interface)

标签 c++-cli prism mef

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

我的 C# 库定义了: - 一个实现 Prism 的类I 模块接口(interface)。 - 一个实现 C++/CLI 接口(interface)并用 MEF 修饰的类Export属性。

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

我从 Prism 收到 ModuleLoadException,说它找不到我的 C++/CLI 程序集或其依赖项之一。

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

那么我的问题是,是否可以导出一个实现 C++\CLI 接口(interface)的类,并且导出类型是该接口(interface)?

为什么我要在 C++/CLI 库中定义接口(interface)?我希望我们拥有的遗留 C++ DLL 实际上可以在该 C++\CLI 库中定义他们的契约(Contract),并让 C# 库引用该契约(Contract) 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);
        }
    }
}

部署 C++/CLI 程序集应该没有特殊要求,因为无论如何在部署时都是一样的。您能否检查是否也使用 C++/CLI 程序集部署了任何依赖项?

关于c++-cli - 是否可以使用 MEF 和 Prism 导出 C++ CLI 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7113085/

相关文章:

c# - 开放通用类型不会在目录中注册

c# - `Could not load file or assembly ' Microsoft.Windows.Shell`, Prism - C#

c# - 从 C# 代码调用 C++ native dll

c# - 任何 cpu 和 x64 之间的托管代码引用

c# - Prism v4 使用 DirectoryModuleCatalog 按需加载模块

service - Prism 应用程序 CAL 中的菜单服务

mef - 为什么 MEF 目录使用 IQueryable 而不是 IEnumerable?

从 System::String ^ 到 const wchar_t * 的字符串转换

visual-c++ - 有没有办法检测 #pragma unmanaged 在 C++/CLI 中是否有效?

xamarin.forms - Prism Forms INavigatedAware 和 INavigatingAware 之间的区别?