我的C#程序如何根据存在的程序集而有所不同?

sha*_*oth 3 .net c# cloud assemblies azure

我想从我的Windows Azure Web应用程序中的自托管Web应用程序中重用一些代码逻辑.目前我的代码如下:

void myFunction( params )
{
   //environment-neutral code
}
Run Code Online (Sandbox Code Playgroud)

我需要重写该代码,以使程序采取不同的行动,具体取决于是否在Azure上:

void myFunctionModified( params )
{
    if( onAzure() ) {
       //run Azure-specific code
    } else {
       //run non-Azure code
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道虚函数,但我需要这样的代码,至少可以在调用那些虚函数之前实例化正确的对象.

问题是实现onAzure()我需要使用仅存在于Windows Azure上的程序集中的东西(RoleEnvironment例如).因此,我不知道如何实现,onAzure()以便在Windows Azure环境之外运行时不会崩溃.

如何根据系统中存在的程序集使应用程序采取不同的行为?

Stu*_*art 8

你能用:

Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable
Run Code Online (Sandbox Code Playgroud)

来自确定应用程序是否在azure中运行


如果您不想在库中包含对Microsoft.WindowsAzure.ServiceRuntime的引用,那么您可以尝试使用AppDomain.CurrentDomain.GetAssemblies()和一些Linq 在已加载的程序集中检查它- 例如

bool runtimeAvailable = AppDomain.CurrentDomain.GetAssemblies().Any(
    assembly => assembly.FullName.StartsWith("Microsoft.Microsoft.WindowsAzure.ServiceRuntime"));
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试Microsoft.WindowsAzure.ServiceRuntime使用Assembly.Load并检查FileNotFoundException 来加载程序集


作为对虚函数的评论的替代/补充,您可以考虑使用依赖注入.