Я создал проект роли Azure Worker. Целевая машина проекта должна быть машиной x64. Я должен вызвать DLL Stasm и OpenCV из рабочей роли. Но я думаю, что они могут быть скомпилированы на машине x86. Что мне делать?Вызвать x86 dll от роли рабочего Azure
ответ
Роль рабочего процесса - это действительно x64. Но это только для этого конкретного процесса. Вы можете связать другой процесс с этими dll x86:
- Возможно, вы можете написать всю свою логику в консольном приложении (x86) и включить ее в свой проект роли сотрудника. Затем в методе Run вашего класса WorkerRole.cs вы можете просто запустить этот процесс (используя Process.Start) для выполнения фактической работы, и ваш класс WorkerRole.cs будет использоваться только как точка входа.
- Вы также можете просто разместить службу WCF во внешнем процессе (это снова может быть простым консольным приложением, скомпилированным в x86). Затем, используя привязку, такую как NetTcpBinding или NetNamedPipeBinding, вы можете вызвать эту службу из своей рабочей роли.
В основном вы пытаетесь использовать родную 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.
+1 для упоминания ProgramEntryPoint, это гораздо более элегантно –
Полезная справочная статья того же автора, который написал этот ответ - http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/04/using-programentrypoint -элементное выслугу четкости в использовании-заказ приложения, как-ролевая точка входа-использование-окон-лазурь-СДК-1-5.aspx – Bern
Спасибо, я попробую. Я думаю, это сработает. –