1

我正在尝试使用ILMerge创建一个使用Windows Azure SDK 2.0的单个可执行文件,包括Microsoft.WindowsAzure.ServiceRuntime.dll我手动添加的,因为我找不到任何包含它的 NuGET 包。

我在 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.

我还测试了没有合并的相同输出,它工作正常。

我在这里想念什么?

4

1 回答 1

1

这似乎无法完成,或者至少不是我想要的方式。

Microsoft.WindowsAzure.ServiceRuntime.dll 似乎对本机库 有依赖性msshrtmi.dll。这意味着 ILMerge 无法处理它,因为非托管代码无法与托管代码合并。

根据 两个问题,有一种方法可以解决此问题,但它涉及将其打包msshrtmi.dll为资源并在需要时将其解包。我觉得这有点hacky。

所以我想我只需要做我之前应该做的事情:Microsoft.WindowsAzure.ServiceRuntime.dll从构建我的 WCF 服务的合并的非 Azure 版本的项目中删除所有引用。这可能涉及使用一些 IoC 容器并进行一些繁重的重构,这就是我在这个阶段试图避免它的原因。

于 2013-06-23T05:47:00.170 回答