假设我在使用C++和C#编写一个应用程序。我想将底层部分用C++编写,高级逻辑部分用C#编写。那么如何从我的C++程序中加载一个.NET程序集,开始调用方法并访问我的C#类的属性呢?
你应该真正了解一下C++/CLI。它能使像这样的任务变得非常轻松。
否则,你就需要在C#代码周围生成COM包装器,并让你的C++应用程序调用这些COM包装器。
[Guid("123565C4-C5FA-4512-A560-1D47F9FDFA20")]
public interface IConfig
{
[DispId(1)]
string Destination{ get; }
[DispId(2)]
void Unserialize();
[DispId(3)]
void Serialize();
}
[ComVisible(true)]
[Guid("12AC8095-BD27-4de8-A30B-991940666927")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class Config : IConfig
{
public Config()
{
}
public string Destination
{
get { return ""; }
}
public void Serialize()
{
}
public void Unserialize()
{
}
}
接下来,您需要对程序集进行regasm操作。Regasm将添加必要的注册表项,以使您的.NET组件可以被视为COM组件。之后,您可以像调用其他任何COM组件一样在C++中调用您的.NET组件。
您可以将.NET组件包装在COM组件中 - 使用.NET工具非常容易 - 然后通过COM调用它。
按照正常方式创建您的.NET程序集,但一定要使用ClassInterface(ClassInterfaceType.AutoDual)标记类,并确保使用SetAssemblyAtribute将程序集信息设置为ComVisible(true)。
然后,使用REGASM创建COM包装器:
regasm mydll.dll /tlb:mydll.tbl /codebase f:_code\ClassLibraryForCom
请务必使用/codebase指令--如果您不打算给程序集命名,则这是必需的。
rp
由于C#可以导入C++标准导出,因此在C#应用程序中加载C++ dll可能比从C++使用COM更容易。
请参阅System.Runtime.InteropServices.DllImport的文档。
此外,以下是您可以在托管代码和非托管代码之间执行的Interop类型的完整列表:
http://blogs.msdn.com/deeptanshuv/archive/2005/06/26/432870.aspx
简而言之: