2011-06-03 96 views
6

有没有办法让我的ASP.net应用程序知道它是否在SharePoint(2010)中运行,但没有引用SharePoint程序集? (所以我不能只检查SPContext.Current是否为空)。检测我是否在SharePoint中运行

我想知道是否可行,以获得所有名称加载的程序集?所以如果我看到我的AppDomain包含一个Microsoft.SharePoint程序集,那么我知道我在SharePoint中。

用例:程序集也在SharePoint之外运行,但引用SharePoint DLL时需要部署它们(不可能是由于许可)或在访问SharePoint方法时获取异常。

目前我使用条件编译,但我想远离并使用DI机制来选择两个类之一,具体取决于我是否在SharePoint中。

回答

9
bool isSharepoint = 
    AppDomain 
     .CurrentDomain 
     .GetAssemblies() 
     .Any(a => new AssemblyName(a.FullName).Name == "Microsoft.SharePoint"); 

未经检验的,但是这将执行一个加载的程序集的名字是在Microsoft.SharePoint程序检查

+0

小问题:。它的'AppDomain.CurrentDomain.GetAssemblies()..' – 2011-06-03 21:23:30

+0

还有两件事:.Any需要一个Predicate,这样你可以摆脱.Where。另外,AssemblyName是StartsWith,不是==,因为它很强壮y命名。 'AppDomain.CurrentDomain.GetAssemblies()。Any(a => a.FullName.StartsWith(“Microsoft.Sharepoint”));'这是我目前的方法。 – 2011-06-03 21:26:23

+1

@Michael Stum,这就是为什么我将它传递给AssemblyName构造函数的原因,因为MS建议不要手动解析FullName“不建议编写自己的代码来解析显示名称,而是将显示名称传递给AssemblyName构造函数,解析它并填充新的AssemblyName的相应字段。“ – Guvante 2011-06-03 21:33:16

1

一种方法是检查当前进程的命令行参数(w3wp.exe)并查找“-ap”SharePoint Content AppPool“。我个人更喜欢你提到的方法(寻找Microsoft.SharePoint .DLL组装)

相关问题