将DLL文件移动到Azure云服务部署包中

3
有没有一种稳定,简单的方法将文件复制到 Azure 云服务部署包中,而不需要在 Web 项目中包含或引用它? 我们有一个站点,既要作为 Azure 云服务项目中的 Web 角色托管,也要在本地托管,每个托管方式都需要不同的数据访问层库。我们可以将所有必要的文件都倒入该项目中,并在生成时进行复制,然后根据环境变量动态选择加载哪些程序集,但这似乎有点不太规范,而且我们可能不想让这些库坐落在远程 Azure 区域的服务器上。这些程序集不是项目直接引用的,而是在运行时使用 MEF 或某些类似机制进行加载。 下面是我们尝试过的一个构建后脚本:
if "$(TargetProfile)" == "" (
     echo "OnPrem"
     xcopy /Y "$(ProjectDir)\lib\OnPrem\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"

) else (
     echo "Cloud"
     copy /Y "$(ProjectDir)\lib\Cloud\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"
)

这个方案可行,即在构建期间将文件复制到预期的位置,并在msbuild /t:publish步骤中构建网站项目。然而,TestLibrary.dll文件未包含在云服务包中,未被部署,并在运行时加载失败。
Azure部署中是否曾经出现过类似的情况?我承认可能我们的方法不对,但我还没有找到适合我们需求的优雅解决方案。
1个回答

2

在尝试了一段时间后,我发现了一个能够实现我想要的功能的策略。您可以将内容文件添加到CloudService角色中,并像以下方式一样打包和部署云服务:

  1. 在Visual Studio中,右键单击CloudService项目内的WebRole,然后选择“添加现有项”
  2. 浏览并选择要添加的.dll文件。
  3. 您甚至可以创建文件夹等来组织这些文件。

这些文件将被添加到.cspkg中的approot中,并在部署时类似地出现在approot文件夹中。为了解决这个目录问题,我做了以下操作:

string appRoot = Environment.GetEnvironmentVariable("RoleRoot");
appRoot = Path.Combine(appRoot + @"\", @"approot\");

您仍然需要一种方法来复制本地 .dll 文件以进行本地部署,但我们已经在现有的部署过程中有了一种方法。使用 CloudConfigurationManager 中的配置设置,您可以告诉应用程序如何解析这些 .dll 文件应该驻留的目录,例如:

    var libDir = CloudConfigurationManager.GetSetting("Environment").Equals("Cloud") 
        ?
        Environment.GetEnvironmentVariable("RoleRoot")
            .Path.Combine(appRoot + @"\", @"approot\")
        :
        HostingEnvironment.MapPath("~\pathToOnPremDlls\")

感觉有点像黑客,但似乎工作得足够好。


我认为没有明显的限制。在注册MEF容器之前的任何地方都可以。Global.asax的Application_OnStart()可能适用。 - JonathanBedrava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接