将 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 角色,如下所示:
- 在Visual Studio中右击CloudService项目里面的WebRole然后select"Add Existing Item"
- 浏览并 select 您要添加的 .dll。
- 您甚至可以创建文件夹等来组织这些文件。
这些文件被添加到 .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\")
感觉有点乱,但似乎运行良好。
是否有可靠、简单的方法将文件复制到 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 角色,如下所示:
- 在Visual Studio中右击CloudService项目里面的WebRole然后select"Add Existing Item"
- 浏览并 select 您要添加的 .dll。
- 您甚至可以创建文件夹等来组织这些文件。
这些文件被添加到 .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\")
感觉有点乱,但似乎运行良好。