C#Form C ++ DLL中的应用程序

时间:2017-01-13 21:39:56

标签: c# c++ .net dll

我有一个用C#开发的Windows窗体应用程序来进行网络摄像头捕获。我需要从一个名为Magic的应用程序开发环境中调用这个C#表单(不要问为什么)。

如果所有我必须做的就是调用.exe我会没事的,但由于复杂的原因,我不允许在生产环境中使用.exe的;因此,我需要一个可以加载到应用程序中的DLL。我不能使用C#DLL,因为它没有像C ++那样公开它的函数的.def文件(如果你能为我解决这个问题,那么就不需要进一步了)。因此,我需要找到一种方法来创建一个C ++包装器,它将提供在应用程序和C#窗体/ DLL之间传递数据的能力。

我在这里阅读的大多数内容建议将其注册为COM对象,但我不能这样做,因为这将被部署到100多台机器并为每个人注册它不会与我们的系统管理员一起飞行。任何人都可以帮助提供指南或建议我应该开始调查哪条路线?我已经尝试了多种方法都失败了,我在这里寻找一些帮助和指导。

1 个答案:

答案 0 :(得分:1)

我对您的问题的理解是您需要在从本机C ++ DLL调用的托管C#DLL中显示一个表单。这可以做到,我在一些项目中使用了这个。我创建了一个快速的C ++控制台应用程序(相同的代码可以放在DLL中),项目源代码CallManagedFromNative

另一个解决方案是创建一个可以捕获网络摄像头数据的本机C ++项目,例如使用Microsoft Media Foundation,如果感兴趣的话可以在MediaFoundation找到源代码。

无论如何回到原生C ++调用托管C#表单样本。

#include "stdafx.h"
#include <iostream>

#include "Base\NativeProxy.h"
#include "Base\Types.h"

using namespace Nequeo::System::Any;

int main()
{
    std::vector<boost::any> param;
    param.push_back(3);
    boost::any returnData;

    Nequeo::NativeProxy managedProxy(L"ClassLibraryManaged.dll", L"ClassLibraryManaged.Class1");
    managedProxy.executeManaged(L"OpenForm", param, returnData);

    int retFromCall = boost::any_cast<int>(returnData);
    std::cout << retFromCall;        
    return 0;
}

指定托管DLL,命名空间和类名。现在调用一个传递参数的方法和一个返回值。托管DLL中的代码:

namespace ClassLibraryManaged
{
    public class Class1
    {
        public Class1() { }

        public int OpenForm(int a)
        {
            TestForm form = new TestForm();
            form.ShowDialog();
            return a * a;
        }
    }
}

示例项目包含测试项目所需的所有包含,bin和lib,您唯一需要的是boost我在此项目中使用了版本161,您可以使用自己的构建,或者您可以从BoostBuild161

下载我的版本