1

我正在尝试查看是否可以在我们的 Web 应用程序中使用 Reg-Free COM 来简化遗留 COM 组件的部署。但是,在我开始研究将它用于互操作情况之前,我无法进行简单的测试。这是我所做的:-

1) 创建一个新的 VB ActiveX DLL 项目。除了打开二进制兼容性之外,所有选项都保留为默认值。添加了一个名为“SayHello”的简单方法的类。
2) 在 Vs.NET 2008 (SP1) 中创建一个新的 c# 控制台应用程序。将 CPU 设置为 x86,并添加对我的 COM DLL 的引用。
3) 为参考打开“隔离”
4) 从 c# 控制台应用程序调用我的 SayHello 方法 - 一切正常。
5) 使用 regsvr32 /u 手动取消注册 COM dll
6) 再次尝试运行控制台应用程序。该应用程序失败并出现 COM 错误,因为它找不到 COM 注册信息。我可以确认清单存在(粘贴在下面)

我在 64 位的 Vista 上运行它,如果这有什么不同的话。

感谢您的任何指示。

<?xml version="1.0" encoding="utf-8"?>
<assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity name="TestRegFreeCom.exe" version="1.0.0.0" processorArchitecture="x86" type="win32" />
  <file name="TestProject.dll" asmv2:size="20480">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>uIK8e9FAnH4SQwk6PRfrjdZHWuw=</dsig:DigestValue>
    </hash>
    <typelib tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="{c540c43a-4d80-4c87-9091-dff664df0021}" tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" progid="TestProject.Testy" />
  </file>
</assembly>
4

3 回答 3

2

您的代码示例似乎是 COM 对象 DLL 的清单。你也有主程序的清单吗?它需要一个将另一个对象列为依赖项的对象。

回答有关此主题的较早问题时,我的测试是一个 C# 程序,它使用了 VB5/VB6 提供的旧 ActiveX 控件。我的主程序的清单如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
<assemblyIdentity
            type = "win32"
            name = "client"
            version = "1.0.0.0" />
<dependency>
            <dependentAssembly>
                        <assemblyIdentity
                                    type="win32"
                                    name="MSFLXGRD.X"
                                    version="6.1.97.82" />
            </dependentAssembly>
</dependency>
</assembly>

dependentAssembly/assemblyIdentity 元素上的 name 属性应与 COM DLL 清单中的属性匹配。正如您在此处看到的,它不必是实际的文件名。

我看到的另一个可能的问题是清单中没有 comInterfaceExternalProxyStub 元素。MSDN 上的这篇文章中提供了该标记的示例和其他操作的演练:COM 组件的免注册激活:演练。步骤 6 和 7 讨论创建两个清单。

于 2008-11-25T18:24:56.453 回答
2

如果您在应用程序中引用 .dll,请单击项目中引用下的引用 dll,查看属性并将“隔离”设置为 TRUE。

这将在您的项目中包含 .dll,并且您的应用程序将使用包含在您的项目中的 .dll 的副本。

要在此处查看此外观的工作示例:

http://archive.msdn.microsoft.com/SEHE

有问题的 .dll 需要在您构建应用程序的系统上注册才能正常工作。

于 2008-12-29T19:54:26.190 回答
0

感谢您的回复。

我添加的清单是从 .NET 控制台应用程序自动生成的。没有为 COM DLL 本身生成清单。我将查看演练,看看是否提供任何答案。

于 2008-11-26T15:34:34.597 回答