type.Assembly提供了错误的程序集?

3
我想创建对Excel程序集的引用并使用以下代码:
[Test]
public void ExcelTest()
{
    Assembly current = this.GetType().Assembly;
    Assembly excel = typeof(Microsoft.Office.Interop.Excel.Workbook).Assembly;
    Assert.AreEqual(current.FullName, excel.FullName); // Why is excel the same as current assembly?
}

[Test]
public void MscorlibTest()
{
    Assembly mscorlib = typeof(string).Assembly;
    Assert.IsTrue(mscorlib.FullName.StartsWith("mscorlib"));

    Assembly current = this.GetType().Assembly;
    Assert.AreNotEqual(mscorlib.FullName,current.FullName); // As expected
}

为什么Excel与我的当前程序集相同?

获取Excel程序集的好方法是什么?

阅读文档时找不到我的愚蠢。

1个回答

5

Excel等软件是通过COM互操作类型来实现的。它是一个接口,带有GUID等装饰。当您使用它时,它使用COM与正在运行的Excel应用程序进行通信。因此,您的引用不是Excel本身,而仅仅是一个薄的COM通信层。

COM互操作类型可以嵌入到您的程序集中,这似乎是这里的情况。您可以将其指定为项目中程序集引用的属性。

例如,请参见:http://msdn.microsoft.com/en-us/library/dd997297%28v=vs.110%29.aspxhttp://msdn.microsoft.com/en-us/library/ee317478.aspx


1
+1 这很有道理,问题是我怎么得到 Excel 组件? - Johan Larsson
据我所知,没有Excel程序集。Excel是一款本地应用程序,而程序集是.NET库。这就是为什么您必须使用COM互操作性才能在.NET中使用它的原因。 - Dirk
@Dirk Assembly.LoadFile(path)会返回Excel程序集,但感觉有点累赘。 - Johan Larsson
我认为Excel是用C++编写的。COM是一个平台无关的通信层。在.NET中,COM非常重要,因为它可以用于与非.NET软件进行通信。当Excel.exe正在运行时,它作为COM服务器运行,而您的应用程序则是COM客户端。当您向COM接口添加引用时,将使用供应商提供的互操作程序集或从类型库生成新的互操作程序集。这个COM接口层位于一个.NET程序集中。但它仅是一个通信层,如果没有本地的Excel本身,它就是无用的。 - fejesjoco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接