Можно ли экспортировать интерфейс C ++ CLI с MEF и Prism? - PullRequest
2 голосов
/ 18 августа 2011

У меня есть интерфейс C ++ / CLI, определенный в библиотеке C ++ (скомпилирован с переключателем / clr). У меня также есть библиотека C #.

Моя библиотека C # определяет: - класс, реализующий Prism Интерфейс IModule.- класс, который реализует интерфейс C ++ / CLI и имеет атрибут MEF Export .

и библиотека C #, и библиотека C ++ \ CLI развернуты в одном и том жепапка.

Я получаю исключение ModuleLoadException от Prism, в котором говорится, что он не может найти мою сборку C ++ / CLI или одну из ее зависимостей.

Если я заменю сборку C ++ / CLI на a.NET один, все работает отлично!

Мой вопрос в том, можно ли вообще экспортировать класс, который реализует интерфейс C ++ \ CLI с типом экспорта, являющимся этим интерфейсом?

ПочемуУ меня есть интерфейс, определенный в библиотеке C ++ / CLI?Я надеялся, что устаревшая C ++ DLL, которую мы имеем, может на самом деле определить свои контракты в этих библиотеках C ++ \ CLI и иметь библиотеки C #, ссылающиеся на этот контрактный dll.Возможно, мой подход неверен, пожалуйста, дайте мне знать, если вы думаете, что есть лучший способ добиться этого.

1 Ответ

4 голосов
/ 24 августа 2011

Я не особо много времени проводил с 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?

...