2010-08-15 94 views
10

我正在研究SharePoint的实用程序。这是一款适用于SharePoint 2007和2010的应用程序。当我有一个对SharePoint.dll 12.0.0.0版本的引用时,该应用程序适用于SharePoint 2007,但不适用于2010年。如果我引用版本14.0.0.0 dll,那么该应用程序在2010年效果很好,但不适用于2007年。在运行时动态选择使用哪个版本的.dll

我可以通过以下代码在文件系统上查看需要使用哪个.dll,在路径中检查12个2007)或14(SharePoint 2010)。

System.IO.File.Exists(
        Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles) + 
        @"\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll")); 

开发时,我做在Visual Studio中引用,所以它建立无论是2007年或2010年。我希望能够释放它适用于BOTH版本的SharePoint的应用程序。所以,我需要一些方法来加载/使用任何.dll对运行应用程序的用户有意义。

如何在运行时动态选择并加载.dll?

回答

14

的反思?依赖注入?你正在为自己而努力!

编译对Microsoft.SharePoint.dll的V12,它会在2007年

部署工作,至2010年,它会“只是工作”(在几乎所有情况下)为SharePoint 2010中已经具有约束力的重定向设置,所以任何对v12的引用将被重定向到v14。

你不需要做任何明智的配置。

,你需要比这更复杂的唯一情况是

  • 实例,其中一些会工作 在2007年而不是2010年(我不能 想不出有什么可手)。

  • 您可能想要使用2010特定功能的地方。

如果是这种情况,那么我个人会做的是双重编译。修改.csproj文件以生成2个稍微不同的版本,在必要时使用参数和条件编译(就像使用#if DEBUG进行产品特定版本的代码一样)(这些代码将很少)。您也可以在.csproj的参考文献中使用这些条件,例如

<Reference Include="Microsoft.SharePoint"> 
    <HintPath Condition="'$(SP2010)'!='true'">PathToV12\Microsoft.SharePoint.dll</HintPath> 
    <HintPath Condition="'$(SP2010)'=='true'">PathToV14\Microsoft.SharePoint.dll</HintPath>   
</Reference> 

缺点

  • 你最终2个版本的 程序

优势

  • 你最终2个版本的程序!您可能想要在2010版本中进行的许多更改将位于manifet.xml,feature.xml和其他配置文件中 - 反射,注入等在这里不会为您做任何事情。
  • 还有一个单一版本的源代码(带有较小的条件编译)
  • 编译器将会捡到更多的错误(例如,它不能在编译时找出你正在用Reflection调用一个时髦的东西v14中的新方法将实际工作)
+0

+1更好的方法 – 2010-08-16 14:35:23

+0

这么多层次上的信息非常丰富。我在这里学到了3件新东西!谢谢! – 2010-08-17 02:23:30

2

我想你需要看看框架中的程序集绑定重定向。

http://msdn.microsoft.com/en-us/library/2fc472t2.aspx

您可以使用 '.NET Framework配置工具' 来配置重定向。

+0

绑定重定向是配置,它不是动态的。 – 2010-08-15 18:58:16

+0

@Kent Boogaart - 是的,但是因为他知道要装入什么组件,所以可以正确配置它们? – SoftwareGeek 2010-08-15 19:08:43

+0

只有当他想为他正在部署的每台机器选择性地配置应用程序时,他说他没有。他希望部署一次,并使其工作,而不管所安装的SP版本如何。 – 2010-08-15 21:53:24

3

截至AppDomain.AssemblyResolve方式,你可以检查DLL的存在,并返回哪一个存在:

AppDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) 
{ 
    if (e.Name == "Microsoft.SharePoint") 
    { 
     // do your check here and return the appropriate Assembly 
     // or maybe just skip an explicit check and instead return either 
     // Assembly.Load("Microsoft.SharePoint, Version=14.0.0.0") or 
     // Assembly.Load("Microsoft.SharePoint, Version=12.0.0.0"), whichever works first 
     // but beware of recursion! 
    } 
}; 

的组件绑定重定向不会在这种情况下,为你工作,因为这是在静态你的配置文件,并且你希望它可以在具有SP2007或SP2010的任何机器上动态工作。

+0

+1 - 我不得不在过去处理这个问题,这就是我所做的。 – 2010-08-15 20:59:38

+0

你不需要这样做 - 查看我的答案。绑定重定向已经在SharePoint 2010中将v12重定向到v14,因此它将“自动”并且动态地工作。哦 - 并且2007也将2003(v11)重定向到v12。 – Ryan 2010-08-16 13:14:10

-1

这听起来像使用DI框架如UnityCastle Windsor之一的依赖注入的一个很好的例子。还有其他人,但我已经冒着一场宗教战争冒险,仅仅提到这两个。 :)

4

您需要使用反射。看看Assembly.LoadFileAssembly.Load

如果你需要在它的类的方法来工作,你可以使用它像这样:

 Assembly u = Assembly.LoadFile(path); 
     Type t = u.GetType(class title); 
     if (t != null) 
     { 
      MethodInfo m = t.GetMethod(method); 
      if (m != null) 
      { 
       if (parameters.Length >= 1) 
       { 
        object[] myparam = new object[1]; 
        myparam[0] = ......; 
        return (string)m.Invoke(null, myparam); 
       } 
       else 
       { 
        return (string)m.Invoke(null, null); 
       } 
      } 
     } 
     else 
     { 
      // throw exception. type not found 
     } 
+0

反对的任何理由? – Incognito 2010-08-16 17:06:54

相关问题