C#和F#中的COM互操作有什么不同?

时间:2016-10-28 07:34:39

标签: c# f# outlook com-interop

我使用Microsoft.Office.Interop.Outlook程序集获得了一些简单的Outlook interop F#代码。但是,当我将其部署到客户机器上时,只要应用程序尝试使用互操作代码执行任何操作,它就会弹出,因为它无法找到程序集 - 因此我得到了一个级联应用程序的FileNotFoundException。 / p>

但是,如果我在C#中运行相同的代码(即使通过F#程序集调用),它也能正常工作。

open Microsoft.Office.Interop.Outlook
open System.Runtime.InteropServices
Marshal.GetActiveObject "Outlook.Application" :?> Application

可悲的是,代码在我的机器上工作正常,因此我无法在本地重现问题。但是我对理解更感兴趣的是F#和C#如何引用这个程序集有什么不同?我自己查看了项目文件,并尝试了两种形式的参考文献。第一个基本上是通过VS在F#项目中添加引用时获得的表单: -

  <Reference Include="Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <EmbedInteropTypes>True</EmbedInteropTypes>
    <HintPath>..\..\..\..\..\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Outlook\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Outlook.dll</HintPath>
  </Reference>

我还尝试将copy local设置为true并确保已部署路径中的程序集 - 这不起作用(并且也不应该使用) - 当使用C#应用程序时互操作,它正确定位它。)

我见过的第二种形式如下: -

<COMReference Include="Microsoft.Office.Interop.Outlook">
  <Guid>{00062FFF-0000-0000-C000-000000000046}</Guid>
  <VersionMajor>9</VersionMajor>
  <VersionMinor>6</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>

与其他几个Interop程序集一起使用。

然而,这两个选项都没有用 - F#项目与C#的不同之处在哪里?

0 个答案:

没有答案