2017-01-13 3 views
-2

У меня есть приложение Windows Form, которое я разработал на C#, чтобы сделать захват веб-камеры. Мне нужно вызвать эту форму C# из среды разработки приложений, известной как Magic (не спрашивайте, почему).Приложение C# Form в C++ DLL

Если все, что мне нужно было сделать, это вызвать .exe. Все будет в порядке, но по сложной причине мне не разрешено использовать .exe в рабочей среде; поэтому мне нужно иметь DLL, которая может быть загружена в приложение. Я не могу использовать C# DLL, потому что у него нет файла .def, как на C++, который предоставляет свои функции (если вы можете решить это для меня, тогда вам не нужно идти дальше). Поэтому мне нужно найти способ создания C++-обертки, который обеспечит возможность передачи данных между приложением и формой Windows C#/DLL.

Большинство вещей, которые я читал здесь, предлагает зарегистрировать его как объект COM, но я не могу этого сделать, потому что он будет развернут на 100 машинах и зарегистрирован для каждого из них, который не будет летать с нашими системными администраторами. Может ли кто-нибудь помочь в предоставлении руководства или предложить, какой маршрут я должен начать расследовать? Я пробовал несколько методов, которые все провалились, и я действительно ищу помощь и рекомендации здесь.

+0

http://tigerang.blogspot.in/2008/09/reverse-pinvoke.html –

+0

Любой вид обмена сообщениями может работать как альтернатива COM; включая именованные каналы или сокеты; хотя было бы лучше использовать что-то более высокоуровневое, такое как ZeroMQ или другое * MQ framework, или даже иметь какую-то конечную точку службы SOAP или REST в вашем приложении C#. –

ответ

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; 
     } 
    } 
} 

проект содержит все включает, бункера и ЛИЭС вам нужно будет проверить ваш проект, единственное, что вам нужно, это boost я использовал версию 161 для этого проекта вы можете используйте свою собственную сборку или вы можете загрузить мою сборку с BoostBuild161

+0

Вы представляете интересный код, но я не могу найти, где вы определяете COM Threading Model? Компоненты GUI WindowsForm можно запускать только из процесса с моделью STA. –

+0

99,99% кода, который открывает форму, находится в образце кода. Показанный код - это простое использование. –

+0

Я имею в виду, что приложение C# exe с графическим интерфейсом должно быть написано '[STAThread] static void Main()'. –

Смежные вопросы