我的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环境之外运行时就不会崩溃。

如何根据系统中存在的程序集使应用程序的操作有所不同?

我的C#程序如何根据存在的程序集而表现不同

你能使用:吗

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)。