我的C#程序如何根据存在的程序集而表现不同
本文关键字:程序集 存在 程序 何根 我的 | 更新日期: 2023-09-27 17:59:30
我想在我的Windows Azure web应用程序中重用自托管web应用程序的一些代码逻辑。目前我有这样的代码:
void myFunction( params )
{
//environment-neutral code
}
我需要重写该代码,使程序根据是否在Azure上而有所不同:
void myFunctionModified( params )
{
if( onAzure() ) {
//run Azure-specific code
} else {
//run non-Azure code
}
}
是的,我知道虚拟函数,但在调用这些虚拟函数之前,我需要这样的代码来至少实例化正确的对象。
问题是要实现onAzure()
,我需要使用仅在Windows Azure上存在的程序集中的内容(例如RoleEnvironment
)。所以我不知道如何实现onAzure()
,这样它在WindowsAzure环境之外运行时就不会崩溃。
如何根据系统中存在的程序集使应用程序的操作有所不同?
你能使用:吗
Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable
from确定应用程序是否在azure中运行
如果你不想在库中包含对Microsoft.WindowsAzure.ServiceRuntime的引用,那么你可以尝试使用AppDomain.CurrentDomain.GetAssemblies()
和一些Linq(例如)在加载的程序集中检查它
bool runtimeAvailable = AppDomain.CurrentDomain.GetAssemblies().Any(
assembly => assembly.FullName.StartsWith("Microsoft.Microsoft.WindowsAzure.ServiceRuntime"));
或者,您可以尝试使用Assembly.Load
加载Microsoft.WindowsAzure.ServiceRuntime
程序集,并检查FileNotFoundException
作为对虚拟函数注释的替代/补充,您可以考虑使用依赖项注入。
如果您需要编写有条件地依赖于不同程序集的代码,您可以使用条件编译来构建应用程序的不同版本,以针对以下两种托管模型:
public void MyFunction()
{
#if AZURE
// Code that depends on the Azure assemblies
#elseif
// Code that depends on the .NET Framework assemblies
#end if
}
然后,您可以在项目文件中定义一个特定的构建配置,该配置定义AZURE
编译器符号,如本例所示:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Azure|AnyCPU' ">
<DefineConstants>TRACE;AZURE</DefineConstants>
</PropertyGroup>
如果不能像其他答案所建议的那样使用条件编译符号,那么。。。
你能尝试使用仅存在于Azure上的反射获取一个类型吗?如果它找不到类型,则说明你不在Azure上。
或者,如果你想走程序集路线,那么你可以为你的Azure程序集检查AppDomain.CurrentDomain.GetAssemblies()
。
这看起来确实是一个很好的依赖注入案例。需要Windows Azure RoleEntryPoint或其他Windows Azure特定功能的功能应该隐藏在注入的接口后面(Autofac、Unity、Castle Windsor、Ninject、MEF等)。MyAzureImplementation:IMyFunctionProvider)。