2008-11-03 53 views
3

在Visual Studio項目中,我有三個層,即數據層,業務層和表示層。部署和引用XSLT文件的最佳方法

在數據層中我有幾個XSLT將一些對象轉換爲電子郵件,所有工作正常,但我發現XSLT在構建時不會被構建/複製。

我目前在部署位置創建了一個文件夾,並放置了XSLT,但我擔心依靠手動過程來更新這些文件。

有沒有人遇到類似的問題,如果是的話他們是如何解決它的。

它更改MSBuild腳本以將構建工件複製到所需的位置,是否有人有這樣的例子?

Thaks

回答

4

如果使用Visual Studio 2005/2008,最簡單的方法是將XSLT文件包含爲項目資源。

  1. 打開項目的屬性。
  2. 選擇資源選項卡。您可能會看到一個鏈接,指出「此項目不包含默認資源文件,請點擊此處創建一個。」繼續並點擊。
  3. 單擊頂部附近的添加資源下拉列表並選擇添加現有文件。
  4. 瀏覽到您的XSLT文件並選擇它們。

你已經這樣做了之後,你可以輕鬆地訪問資源的方式如下:

// To get the contents of the resource as a string: 
string xslt = global::MyNamespace.Properties.Resources.MyXsltFile; 
// To get a Stream containing the resource: 
Stream xsltStream = global::MyNamespace.Properties.Resources.ResourceManager.GetStream("MyXsltFile"); 


如果您正在使用Visual Studio 2003中,你最好的辦法是包括那些XSLT文件作爲嵌入資源的DLL。在Visual Studio中,在解決方案資源管理器中選擇文件,打開屬性窗格,並將構建類型更改爲「嵌入式資源」。然後,您可以使用GetManifestResourceStream method來獲取包含XSLT的Stream。要傳遞的名稱將基於程序集的默認命名空間,包含該文件的文件夾和文件的名稱。

例如,假設您的數據層程序集具有My.DataLayer的默認名稱空間。在您的數據層項目中,您有一個名爲Templates的文件夾,其中包含一個名爲Transform.xslt的文件。讓你的XSLT代碼如下所示:

// There are numerous ways to get a reference to the Assembly ... this way works 
// when called from a class that is in your data layer. Have a look also at the 
// static methods available on the Assembly class. 
System.Reflection.Assembly assembly = (GetType()).Assembly; 
System.IO.Stream xsltStream = assembly.GetManifestResourceStream("My.DataLayer.Templates.Transform.xslt"); 

欲瞭解更多信息,請查閱this article on CodeProject

+0

請注意,在2005年,按照這裏的確切程序獲取資源作爲流,我得到「System.InvalidOperationException:資源'xxx'不是Stream - 調用GetObject而是」。 – tjmoore 2010-07-29 11:00:22

0

明顯的問題也許,但仍然要問,你有沒有包括含有XSLT的項目本身的文件夾?這是一個網絡或表單應用程序?

0

在VS中,很容易設置項目中的XSLT文件的屬性以在構建時複製,默認情況下它們不會。

0

我可能已經很差地解釋自己了。

數據層是表示層引用的類庫。

在構建DataLayer時,我可以將XSLT輸出到DataLayer的Bin目錄。但是,當我構建併發布表示層時,它正確地抓取DLL而不是XSLT