引用另一个项目中的枚举

本文关键字:枚举 项目 另一个 引用 | 更新日期: 2023-09-27 18:27:46

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

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

项目2包含ConvertDocument,WdSaveFormat来自项目2中引用的Microsoft.Office.Interop.Word。

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

无法解析符号"WdSaveFormat"。

我的问题是,我是否可以在引用Project1中Microsoft.Office.Interop.Word的project2中引用该枚举,而不必添加引用?

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

再次感谢!

引用另一个项目中的枚举

最好的解决方案是创建自己的类型,以便在库和项目之间封送参数。

不需要项目之间的通信来了解第三方库(除非它们总是以这种方式紧密耦合)。创建自己的类型以在项目库之间封送要好得多。然后接收项目(被调用者)将从您的自定义类型转换为第三方库类型。

在这种情况下,项目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;
         }
    }

否,项目1将需要对Microsoft.Office.Interop.Word.的引用

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

例如:

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

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

不,这是不可能的。WsSaveFormat是在Word.Interop中定义的,因此,如果不添加在项目1中无法使用的引用。但是(请注意,我不建议这样做),您可以在项目2中定义一个类似的枚举,并让项目1使用该枚举。当然,你需要一个从你的枚举到Word.Interop枚举的映射。

在处理office互操作时,我发现的最好的经验法则是:不要导出任何公开互操作类型的内容。唯一公开的类型应该是包装互操作行为的类型。据我所知,这对所有第三方代码来说都是一条很好的经验法则。

否,必须在Project1中添加对Microsoft.Office.Interop.Word的引用,才能使用程序集中定义的枚举。它不会花费任何内存,因为您的Project2无论如何都在使用引用(并且您在Project1中使用Project2)

否,您在项目1中使用枚举WdSaveFormat,因此需要对Microsoft.Office.Interop.Word.的引用

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