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

Move DLLs to Azure Cloud Service deployment package

是否有可靠、简单的方法将文件复制到 Azure 云服务部署包,而无需在 Web 项目中包含或引用它?

我们有一个站点,我们将在 Azure 云服务项目和本地作为 Web 角色托管,每个站点都需要不同的数据访问层库。我们可以将所有必要的文件转储到项目中,并在构建时复制它们,然后根据环境变量动态 select 加载哪些程序集,但这似乎有点草率——我们可能有正当理由不这样做' 希望那些库位于遥远的 Azure 区域的服务器上。这些程序集未被项目直接引用,而是在运行时使用 MEF 或某种类似机制加载。

这是我们尝试过的 post-build 脚本:

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 部署中是否做过类似的事情?我承认我们可能采用了错误的方法,但我还没有发现适合我们需要的优雅方法。

在尝试了一段时间之后,我想我已经找到了一种或多或少能达到我想要的效果的策略。您可以将内容文件添加到与云服务一起打包和部署的 CloudService 角色,如下所示:

  1. 在Visual Studio中右击CloudService项目里面的WebRole然后select"Add Existing Item"
  2. 浏览并 select 您要添加的 .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\")

感觉有点乱,但似乎运行良好。