我在 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/