如何在Win32 C+中使用C#dll+;项目 我正在研究一个解决方案,它的核心引擎大部分都是Win32 C++开发的(而且是平台无关的,也用于OS X),前一段时间我们需要调用C++的核心引擎的C++ DLL,我可以在C语言中加载主解决方案的DLL(这里借助于一些线程)。但是现在我们在托管C语言的DLL中实现了某些东西,需要在Win32 C++项目中使用它吗?(仅提供函数定义和dll)

如何在Win32 C+中使用C#dll+;项目 我正在研究一个解决方案,它的核心引擎大部分都是Win32 C++开发的(而且是平台无关的,也用于OS X),前一段时间我们需要调用C++的核心引擎的C++ DLL,我可以在C语言中加载主解决方案的DLL(这里借助于一些线程)。但是现在我们在托管C语言的DLL中实现了某些东西,需要在Win32 C++项目中使用它吗?(仅提供函数定义和dll),c#,winapi,visual-c++,pinvoke,C#,Winapi,Visual C++,Pinvoke,一种解决方案是COM互操作。可能是唯一的解决办法。这是一个大话题。我工作时用的是一本厚厚的蓝皮书。数百页,除了COM互操作之外什么都没有 简短的版本是,在托管端标记一些类和接口,并创建互操作程序集,这些程序集看起来像COM DLL,但实际上是托管程序集的代理。互操作程序集是像COM DLL一样注册的,可以随时使用 MSDN有很多关于它的信息 这可能是一个好的起点。 “向COM公开.NET Framework组件” 它可能是出人意料的容易,但尽量保持简单。< p>您可以创建一个托管C++互操作D

一种解决方案是COM互操作。可能是唯一的解决办法。这是一个大话题。我工作时用的是一本厚厚的蓝皮书。数百页,除了COM互操作之外什么都没有

简短的版本是,在托管端标记一些类和接口,并创建互操作程序集,这些程序集看起来像COM DLL,但实际上是托管程序集的代理。互操作程序集是像COM DLL一样注册的,可以随时使用

MSDN有很多关于它的信息

这可能是一个好的起点。 “向COM公开.NET Framework组件”


它可能是出人意料的容易,但尽量保持简单。

< p>您可以创建一个托管C++互操作DLL,作为C语言库周围的包装器。 <>托管C++的大多数教程只说明如何封装非托管C++用于C语言中。但它也可以以另一种方式工作

在本地C++代码中定义抽象接口类,然后在托管C++ DLL中创建具体子类。在方法实现中调用C#对象

最后,导出一个工厂函数,该函数将实例化实现类并返回本机代码可以使用的基类指针

下面是一个简单的例子:

首先,在本机DLL中定义类接口

interopclassbase.h

class InteropClassBase
{
public:
    virtual void doStuff() = 0;
    virtual int getValue() = 0;
    virtual void getString(CString* outStr) = 0;
};
现在,您需要创建一个C++/CLI DLL,它允许您在单个程序集中混合使用本机代码和托管代码。在您的解决方案中添加一个新的C++项目,在项目配置中设置选项为<强>混合< /强>(/CLR)。p> 一旦您添加了对C#library(我们称之为ManagedLibrary)的引用,我们就可以实现interop类:

interopclass.cpp

#include "interopclassbase.h"
#include <vcclr.h>

public class InteropClass : public InteropClassBase
{
protected:
    gcroot<ManagedLibrary::ManagedObject^> m_managedObject;

public:
    InteropClass()
    {
        m_managedObject = gcnew ManagedLibrary::ManagedObject();
    }

    virtual void doStuff()
    {
        m_managedObject->doStuff();
    }

    virtual int getValue()
    {
        return m_managedObject->getValue();
    }

    virtual void getString(CString* pOutStr)
    {
        System::String^ managedString = m_managedObject->getString();
        CString nativeString(managedString); // overloaded CString constructor
        if (pOutStr) *pOutStr = nativeString;
    }
};

__declspec(dllexport) InteropClassBase* getImplementationPointer()
{
   return new InteropClass();
}
#包括“interopclassbase.h”
#包括
公共类InteropClass:公共InteropClassBase
{
受保护的:
gcroot m_managedObject;
公众:
InteropClass()
{
m_managedObject=gcnew ManagedLibrary::managedObject();
}
虚空doStuff()
{
m_managedObject->doStuff();
}
虚拟int getValue()
{
返回m_managedObject->getValue();
}
虚拟void getString(CString*pOutStr)
{
System::String^managedString=m_managedObject->getString();
CString nativeString(managedString);//重载的CString构造函数
如果(pOutStr)*pOutStr=本地投资;
}
};
__declspec(dllexport)InteropClassBase*getImplementationPointer()
{
返回新的InteropClass();
}

现在您只需要从您的本地项目加载互操作DLL,并调用导出函数.< /p> 创建一个托管对象并调用它,您就需要在C++进程中运行CLR。p> 在windows下,您可以通过引用mscoree.dll并托管进程中的CLR来托管CLR


对于莫诺河,可以将单运行时嵌入到C++应用程序中。


我读了那篇文章,但我被允许在我的Win32项目中使用COM。呃,为什么不呢?COM是这里的互操作解决方案。坚持纯Win32是项目经理和co针对概率问题做出的决定。但是经过一天的搜索,我想,我必须先在C++中实现DLL的功能,然后继续运行。没有一种独立于平台的方法来从C++程序调用C代码。当时我需要一个临时的解决方案,只不过是Windows,但仍然不允许使用COM。很可能以后会把DLL移植到C++上移植。(但我不能使用基于MO的解决方案来移植,也?),除了使用基于COM的包装器来使用非托管C++中的托管C*SydLL之外,没有其他方法。Thnx用于解释Spike&Dewb。@Dewb:你能举个例子吗?很有趣。好吧,我把一些东西放在一起了。很晚了,我可能犯了错误,但这应该给你一个基本的想法。你知道什么过程启动CLR吗?在创建托管对象之前,我认为您需要运行CLR。混合模式C++/CLI DLL的托管部分实际上是在加载时由CLR初始化的——更多信息:是的,头文件应该包含在本机DLL和混合模式C++/CLI DLL中。您应该实际阅读链接到的文章。它们都是对COM接口的描述。CLR的非托管API是COM。