如何让两个项目引用相同的第 3 方程序集,并使它们的类型相等?

How to get two projects to reference the same 3rd party assembly, and have their types be equal?

我有我的主项目,还有另一个单元测试项目。两者都引用相同的第 3 方程序集(在我的例子中是 Microsoft.Office.Interop.Outlook

如果我将我的单元测试项目中创建的对象的 Type 与主项目代码创建的对象进行比较,则它们不相等。

这是我测试的一些简化代码

// Comes from my main project's .DLL
var foreignProjectObj = new ForeignObject();
// Some object created by ForeignObject, defined in the 3rd party assembly.
var foreignCreatedMailItem = foreignProjectObj.MailItem;
var foreignMailItemType = typeof(foreignCreatedMailItem);

// Referencing the 3rd party assembly from the Unit Test project
var localMailItem = new MailItem();
var localType = typeof(localMailItem);

Debug.WriteLine(localType.Equals(foreignMailItemType)); // False.

通过查看它们的 Assembly 属性,我可以看出这两种类型实际上是不同的:

在 ForeignObject 中创建的 MailItem: Assembly = {MyOutlookAddIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adc2a93327de863b}

从单元测试项目创建的 MailItem: Assembly = {Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c}

我的问题是如何让两个项目创建具有相同 Type 信息的对象。两个项目都引用相同的 .DLL,但我的主项目实例化的对象与我的单元测试项目中创建的对象的类型仍然不同。

您正在将互操作类型嵌入到您的 MyOutlookAddIn 程序集中。在 MyOutlookAddIn 项目中,展开引用节点。找到 Outlook 引用,右键单击它和 select 属性。将 Embed Interop Types 属性 更改为 False.