【问题标题】:Is it possible to Export a C++ CLI interface with MEF and Prism是否可以使用 MEF 和 Prism 导出 C++ CLI 接口
【发布时间】:2011-10-30 02:19:01
【问题描述】:

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

我的 C# 库定义: - 一个实现PrismIModule 接口的类。 - 一个实现了 C++/CLI 接口并用MEF Export 属性修饰的类。

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

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

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

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

为什么我在 C++/CLI 库中定义了接口?我希望我们拥有的旧版 C++ DLL 实际上可以在 C++\CLI 库中定义它们的合约,并让 C# 库引用该合约 dll。 也许我的方法是错误的,如果您认为有更好的方法来实现这一点,请告诉我。

【问题讨论】:

    标签: c++-cli prism mef


    【解决方案1】:

    我之前并没有花太多时间使用 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 程序集是否也部署了任何依赖项吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多