引用另一个项目中的枚举
本文关键字:枚举 项目 另一个 引用 | 更新日期: 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。