CLR2 编译的 C# COM 不适用于 .Net 4



有人知道为什么仅与Clr4(.net 4)一起使用的Clr2(.NET 3.5)编译的C#创建的COM库不起作用?Clr4中的Clr2中缺少什么?

我们在app.config中使用适当的启动以在CLR4/.NET 4:

下运行C#运行
<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

所有C#东西都可以使用,直到尝试创建我们的COM界面为止。它提供了以下例外:

无法加载运行时。(Hresult的例外:0x80131700)

当我们尝试从C 创建COM接口时,我们会遇到相同的问题。

我们安装CLR2(.NET 3.5)一旦所有com开始工作。我们想知道发生了什么。

在.NET 4中编译组件后,您可能需要使用RegasM.exe来更新RuntimeVersion。如果不是重新编译,则可能将注册表中的Runtimeversion从v2.0.50727更改为v4.0.30319。这对我有用。我在这里找到了一个类似的答案:在.NET-4-4-inly System

上使用.NET-2.0键入的com dll

汇编已注册为 require clr v2,但您明确禁止使用.config文件加载该版本。.config文件中您需要一个 extra bit,可以说:"我知道,但是没关系"。这样:

<startup useLegacyV2RuntimeActivationPolicy="true">
   <supportedRuntime version="v4.0"/>
</startup>  

请注意,您正在故意绕过.NET 4中添加的并列内部版本控制功能。具有不同的CLR版本要求。当然,这听起来像您的场景。在这种情况下,更兼容的鼠标陷阱是允许加载两个版本的CLR:

<startup>
   <supportedRuntime version="v4.0"/>
   <supportedRuntime version="v2.0.50727"/>
</startup>  

另一个非常重要的细节是此.Config文件的名称和位置。它不是直觉的,但是CLR从启动EXE的目录和名称中找到了.config文件。因此,如果要从本机C 程序中测试此[Comvisible]服务器,例如C: foo bar.exe,则必须将文件命名为" bar.exe.config",然后将其复制到C: foo Directory。将.config文件放入与带有DLL名称的DLL相同的目录, not work。

CLR版本写在.dll文件标头中,其值通过regasm工具复制到注册表中。然后,激活器尝试使用指定的精确CLR版本运行组件。要使CLR 4运行CLR 2组件中实现的组件,您可以手动更改注册信息(class/{clSID}/inprocserver32/component-version/runtimeversion)或按照上一个答案中所述设置useLegacyV2RuntimeActivationPolicy(配置文件真的确实走到本机.exe旁边,这没什么错)。

相关内容

  • 没有找到相关文章

最新更新