2013-06-17 8 views
1

Я пытаюсь использовать ILMerge, чтобы создать единый исполняемый файл, который использует Windows Azure SDK 2.0 включая Microsoft.WindowsAzure.ServiceRuntime.dll, который я добавил вручную, потому что я не мог найти какой-либо пакет NuGet, который содержит его.ILMerge: Как объединить библиотеку времени Azure?

Я использую следующую командную строку на событие VS2012 после сборки:

/wildcards /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /log:ILMerge.log /closed Output.exe *.dll /out:Executable.exe 

Однако, я получаю следующее сообщение об ошибке в ILMerge.log, хотя отчеты выходного окна никаких проблем вообще после здание:

The assembly 'Microsoft.WindowsAzure.ServiceRuntime' was not merged in correctly. It is still listed as an external reference in the target assembly. 
An exception occurred during merging: 
ILMerge.Merge: The assembly 'Microsoft.WindowsAzure.ServiceRuntime' was not merged in correctly. It is still listed as an external reference in the target assembly. 
    at ILMerging.ILMerge.Merge() 
    at ILMerging.ILMerge.Main(String[] args) 

И то исполняемый выдает следующее исключение при открытии:

System.Reflection.TargetInvocationException: Exception has been thrown by the 
target of an invocation. ---> System.IO.FileNotFoundException: Could not load file 
or assembly 'msshrtmi, Version=2.0.0.0, Culture=neutral, publicKeyToken=31bf3856ad364e35' 
or one of its dependencies. 

Я также тестировал один и тот же выход без слияния, и он отлично работает.

Что мне здесь не хватает?

+0

Что вы будете делать с этим исполняемым файлом после его получения? – sharptooth

+0

Я включу его в пакет установщика. Я хочу сохранить все в одном файле. Зачем? –

+0

Я полностью понимаю, почему вам нужен один исполняемый файл для вашего установщика. Это не роль облачного сервиса, не так ли? – sharptooth

ответ

1

Казалось бы, это невозможно, или, по крайней мере, не так, как я хочу.

Microsoft.WindowsAzure.ServiceRuntime.dllseems to have a dependency в родной библиотеке msshrtmi.dll. Это означает, что ILMerge не может справиться с этим, поскольку неуправляемый код не может быть объединен с управляемым кодом.

В соответствии с thesetwo вопросами есть способ обойти эту проблему, но она включает упаковку msshrtmi.dll в качестве ресурса и ее распаковку, когда это необходимо. Я чувствую, что это хаки.

Так что, я думаю, мне просто нужно сделать то, что я должен был сделать раньше: удалить все ссылки на Microsoft.WindowsAzure.ServiceRuntime.dll из проекта, который создает объединенную, не лазурную версию моей службы WCF. Это может быть связано с использованием некоторого контейнера IoC и серьезного рефакторинга, поэтому я пытался избежать этого на этом этапе.