我有一个用C#开发的Windows窗体应用程序来进行网络摄像头捕获。我需要从一个名为Magic的应用程序开发环境中调用这个C#表单(不要问为什么)。
如果所有我必须做的就是调用.exe我会没事的,但由于复杂的原因,我不允许在生产环境中使用.exe的;因此,我需要一个可以加载到应用程序中的DLL。我不能使用C#DLL,因为它没有像C ++那样公开它的函数的.def文件(如果你能为我解决这个问题,那么就不需要进一步了)。因此,我需要找到一种方法来创建一个C ++包装器,它将提供在应用程序和C#窗体/ DLL之间传递数据的能力。
我在这里阅读的大多数内容建议将其注册为COM对象,但我不能这样做,因为这将被部署到100多台机器并为每个人注册它不会与我们的系统管理员一起飞行。任何人都可以帮助提供指南或建议我应该开始调查哪条路线?我已经尝试了多种方法都失败了,我在这里寻找一些帮助和指导。
答案 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