2012-03-13 67 views
1

我在Project1中調用了project2中的類中的以下代碼。在另一個項目中引用枚舉

PROJECT1正在呼叫: ConvertDocument.Convert(CommandLineFile, 「d:\測試\檢驗.pdf」,WdSaveFormat.wdFormatPDF);

項目2包含ConvertDocument和WdSaveFormat是來自在項目2中引用的Microsoft.Office.Interop.Word。

當我嘗試通過枚舉值與上面的代碼PROJECT2,它給了我:

無法解析符號「WdSaveFormat」。

我的問題是,我可以引用枚舉在項目2所引用從PROJECT1的Microsoft.Office.Interop.Word,而無需添加引用?

我希望有道理...

再次感謝!

+0

每個人都非常滿意。我覺得是這樣,只是不確定我是否可以解決它。感謝大家! – ErocM 2012-03-14 13:44:38

回答

2

最好的解決方案是創建您自己的類型來封送庫和項目之間的參數。

不需要的項目之間的通信,以瞭解第三方庫(除非他們總是會緊緊地以這種方式連接)。創建自己的類型以便在項目庫之間編組好得多。然後接收項目(被調用者)將從您的自定義類型轉換爲第三方庫類型。

在這種情況下,項目1將使用項目1和2都知道的自定義枚舉。項目1將使用此枚舉與項目2進行通信,項目2會將其轉換爲正確的第三方類型。

例如(這是粗糙的僞代碼):

public enum SaveFormat 
{ 
    SaveFormat1 = 0, 
    SaveFormat2 = 1 
}; 

namespace MyProject1 
... 
    public void Save() 
    { 
     MyProject2.SaveDocument(SaveFormat.SaveFormat1);   
    } 

namespace MyProject2 
... 
    ... 
    public void SaveDocument(SaveFormat format) 
    { 
     WdFormat localFormat = this.Translate(format);   
     ... 
    } 

    private WdFormat Translate(SaveFormat format) 
    { 
     switch(format) 
     { 
      case SaveFormat1: 
       return WDFormat1; 
      case SaveFormat2: 
       return WDFormat2; 
      default: 
       return WDFormat3; 
     } 
    } 
+0

這是一個很好的選擇,如果我真的被設置爲不包括參考。 – ErocM 2012-03-14 13:45:56

+0

其實我測試過這個,並且選擇了這個選項。我創建了一個枚舉,它在互操作中模仿了一個,它完美地工作。我現在不必在調用項目中添加引用。謝謝! – ErocM 2012-03-14 14:37:47

3

不,項目1將需要對Microsoft.Office.Interop.Word的引用。

解決這個問題的唯一方法是讓項目2接受對象(或在情況下,INT會更好),而不是WdSaveFormat。 (編輯:或者其他評論者指出,Project 2可以定義自己的枚舉映射回WdSaveFormat)。 Project 2可以將int轉換爲WdSaveFormat枚舉。

例如:

void Convert(string in, string out, int saveFormat) 
{ 
    WdSaveFormat wdSaveFormat = (WdSaveFormat) saveFormat; 
} 

但是,當您嘗試在項目運行1這段代碼,運行時仍然需要能夠找到的Microsoft.Office.Interop.Word副本無論如何。

0

與Office互操作的東西打交道的時候,我發現拇指最好的規則:不要導出任何公開的互操作類型。唯一的暴露類型應該是包裝互操作行爲的類型。據我所知,這是所有第三方代碼的一個很好的經驗法則。

0

不,你必須在一個PROJECT1添加參考的Microsoft.Office.Interop.Word使用的組件限定的枚舉。因爲你是Project2中使用反正參考它不會花費你在內存方面任何東西(你在使用PROJECT1 Project2的)

1

不,這是不可能的。 WsSaveFormat是在Word.Interop中定義的,因此不需要添加在project1中不能使用的引用。然而(並且保持清楚,我不推薦它),你可以在你的project2中定義一個類似的枚舉並讓project1使用該枚舉。當然你需要從你的枚舉映射到Word.Interop枚舉。

0

不,您使用的是項目1枚舉WdSaveFormat所以你需要的Microsoft.Office.Interop.Word的引用。

如果您正在使用消耗另一個dll(例如foo.dll)的項目2中的函數,但未明確使用項目1中的foo.dll中的任何內容,則不需要引用foo。 dll項目1內。

相關問題