2008-11-25 116 views
1

我想看看是否注册免费COM是我们可以在我们的web应用程序中使用,以缓解遗留COM组件的部署。然而,在我开始研究诸如Interop情况下使用它之前,我无法得到一个简单的测试工作。这是我所做的: -注册免费COM不为我工作

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

我在Vista上运行这个,64位,如果这有所作为。

感谢您的指点。

<?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> 

回答

2

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

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

要查看该工作实例看这里:

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

有问题的.dll文件将需要在您构建应用程序使其正常工作,在系统上注册。

2

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

answering an earlier question on this topic,我的测试是一个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上的这篇文章中提供了该标签的示例以及还有什么可以做的演练:Registration-Free Activation of COM Components: A Walkthrough。步骤6和7讨论创建两个清单。

0

感谢您的回复。

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