我在C ++库中定义了C ++ / CLI接口(使用/ clr开关编译) 我也有一个C#库。
我的C#库定义: - 实现Prism IModule接口的类。 - 实现C ++ / CLI接口的类,并使用MEF Export属性进行修饰。
C#和C ++ \ CLI库都部署在同一个文件夹中。
我从Prism那里得到一个ModuleLoadException,说它无法找到我的C ++ / CLI程序集或其依赖项之一。
如果我用.NET替换C ++ / CLI程序集,一切正常!
我的问题是,是否可以导出一个实现C ++ \ CLI接口的类,导出类型是该接口?
为什么我在C ++ / CLI库中定义了接口?我希望我们拥有的遗留C ++ DLL实际上可以在C ++ \ CLI库中定义它们的契约,并让C#库引用该契约dll。 也许我的做法是错误的,如果您认为有更好的方法可以让我知道。
答案 0 :(得分:4)
我之前没有花太多时间在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程序集部署了任何依赖项?