2010-08-15 45 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

相關問題