我在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而不必添加引用的枚举吗?
我希望这是有道理的......
再次感谢!
答案 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中。