加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在Win32 C项目中使用C#dll?

发布时间:2020-12-14 02:08:52 所属栏目:Windows 来源:网络整理
导读:我正在研究一个解决方案,它的大部分核心引擎都是作为Win32 C开发的(并且是独立于平台的,也用于OS X),前段时间我们需要从C#调用C dll的核心引擎,我能够在C#中加载主解决方案的DLL(在SO的某些线程的帮助下).但现在我们在Managed C#dll中实现了某些东西,需要在W
我正在研究一个解决方案,它的大部分核心引擎都是作为Win32 C开发的(并且是独立于平台的,也用于OS X),前段时间我们需要从C#调用C dll的核心引擎,我能够在C#中加载主解决方案的DLL(在SO的某些线程的帮助下).但现在我们在Managed C#dll中实现了某些东西,需要在Win32 C项目中使用它吗? (只提供函数定义和dll)

解决方法

您可以创建托管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/C++LI DLL,允许您在单个程序集中混合使用本机代码和托管代码.将新的C项目添加到您的解决方案中,并在项目配置中将“Common Language Runtime Support”选项设置为Mixed(/ clr).

一旦你添加了对你的C#库(我们称之为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();
}

现在您只需要从本机项目加载互操作DLL并调用导出的函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读