在另一个项目中引用枚举

时间:2012-03-13 22:07:02

标签: c# enums

我在project1中有以下代码,它从project2调用一个类。

Project1正在调用: ConvertDocument.Convert(CommandLineFile,“d:\ testing \ test.pdf”, WdSaveFormat.wdFormatPDF );

Project 2包含ConvertDocument,而WdSaveFormat来自project2中引用的Microsoft.Office.Interop.Word。

当我尝试使用上面的代码将枚举值传递给project2时,它给了我:

无法解析符号“WdSaveFormat”。

我的问题是,我可以在Project2中引用那个从Project1引用Microsoft.Office.Interop.Word而不必添加引用的枚举吗?

我希望这是有道理的......

再次感谢!

6 个答案:

答案 0 :(得分:3)

不,项目1需要引用Microsoft.Office.Interop.Word。

解决这个问题的唯一方法是让Project 2接受对象(或者在这种情况下, int 会更好),而不是WdSaveFormat。 (编辑:或正如其他评论者指出的那样,Project 2可以定义自己的枚举,映射回WdSaveFormat)。然后,Project 2可以将int转换为WdSaveFormat枚举。

例如:

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

但是,当您尝试在Project 1中运行这段代码时,运行时仍然需要能够找到Microsoft.Office.Interop.Word dll的副本。

答案 1 :(得分: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;
         }
    }

答案 2 :(得分:1)

不,这是不可能的。 WsSaveFormat在Word.Interop中定义,因此,无需添加引用,您无法在project1中使用。但是(并且明确表示我不建议它)你可以在project2中定义一个类似的枚举,让project1使用该枚举。当然,您需要从枚举到Word.Interop枚举的映射。

答案 3 :(得分:0)

我在处理办公室互操作时遇到的最好的经验法则是:不要导出任何暴露互操作类型的东西。唯一暴露的类型应该是包含互操作行为的类型。据我所知,这是所有第三方代码的一个很好的经验法则。

答案 4 :(得分:0)

不,您必须在Project1中添加对Microsoft.Office.Interop.Word的引用,以使用程序集中定义的枚举。它不会花费你内存方面的任何东西,因为你的Project2仍在使用引用(你在Project1中使用Project2)

答案 5 :(得分:0)

不,你在项目1中使用了枚举WdSaveFormat,所以你需要一个对Microsoft.Office.Interop.Word的引用。

如果您正在使用项目2中使用另一个dll的函数(例如foo.dll)但没有在项目1中明确使用foo.dll中的任何内容,那么您将不需要引用foo.dll在项目1中。