2012-05-28 4 views
1

Я создал проект роли Azure Worker. Целевая машина проекта должна быть машиной x64. Я должен вызвать DLL Stasm и OpenCV из рабочей роли. Но я думаю, что они могут быть скомпилированы на машине x86. Что мне делать?Вызвать x86 dll от роли рабочего Azure

ответ

1

Роль рабочего процесса - это действительно x64. Но это только для этого конкретного процесса. Вы можете связать другой процесс с этими dll x86:

  • Возможно, вы можете написать всю свою логику в консольном приложении (x86) и включить ее в свой проект роли сотрудника. Затем в методе Run вашего класса WorkerRole.cs вы можете просто запустить этот процесс (используя Process.Start) для выполнения фактической работы, и ваш класс WorkerRole.cs будет использоваться только как точка входа.
  • Вы также можете просто разместить службу WCF во внешнем процессе (это снова может быть простым консольным приложением, скомпилированным в x86). Затем, используя привязку, такую ​​как NetTcpBinding или NetNamedPipeBinding, вы можете вызвать эту службу из своей рабочей роли.
+0

Спасибо, я попробую. Я думаю, это сработает. –

3

В основном вы пытаетесь использовать родную C++ DLL в своей рабочей роли, так что технически вы хотите получить доступ к родным модулям в своей рабочей роли. Я не думаю, что двоичный код OpenCV x86 - это любая проблема с тем, что Worker ole является родным, для этого потребуются небольшие дополнительные усилия.

Полностью согласен с тем, что предлагает @Sandrino, но хотел бы добавить вещь в свое предложение №1. Когда вы создаете свой собственный EXE, который включает в себя всю логику для использования OpenCV, лучше всего запускать непосредственно из параметров ProgramEntryPoint в ServiceDefinition, и вам не нужно иметь какой-либо код, добавленный в роль «Рабочий», если у вас нет конечных точек TCP/IP и хотите использовать в своем приложении. Определение Service будет как показано ниже:

<WorkerRole name="Your_WorkerRole" vmsize="Small"> 
<Runtime executionContext="limited"> 
    <EntryPoint> 
    <ProgramEntryPoint commandLine="_your_application_.exe _Parameters_" setReadyOnProcessStart="true" /> 
    </EntryPoint> 
</Runtime> 
<Endpoints> 
    <InputEndpoint name="_Your_Endpoint_" protocol="tcp" port="80" /> 
</Endpoints> 

Я лично думаю, что второй вариант выше, может быть излишним Сравнительное на # 1.

+2

+1 для упоминания ProgramEntryPoint, это гораздо более элегантно –

+0

Полезная справочная статья того же автора, который написал этот ответ - http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/04/using-programentrypoint -элементное выслугу четкости в использовании-заказ приложения, как-ролевая точка входа-использование-окон-лазурь-СДК-1-5.aspx – Bern