我试图了解Reg-Free COM是否可以在我们的Web应用程序中使用,以简化旧版COM组件的部署。但是,在我开始研究将其用于Interop情况之前,我无法进行简单的测试。这就是我所做的: -
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注册信息。我可以确认清单存在(粘贴在下面)
我在Vista 64Bit上运行它,如果这有所不同。
感谢您的任何指示。
<?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>
答案 0 :(得分: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清单中的name属性匹配。正如您在此处所看到的,它不一定是实际的文件名。
我看到的另一个可能的问题是你的清单中没有comInterfaceExternalProxyStub元素。在MSDN上的这篇文章中,该标记的示例和其他操作的演练:Registration-Free Activation of COM Components: A Walkthrough。步骤6和7讨论创建两个清单。
答案 1 :(得分:2)
如果您在应用程序中引用.dll,请单击项目中引用下的引用dll,查看属性并将Isolated隔离设置为TRUE。
这将在您的项目中包含.dll,您的应用程序将使用项目中包含的.dll副本。
要在此处查看此外观的工作示例:
http://archive.msdn.microsoft.com/SEHE
有问题的.dll需要在您构建应用程序的系统上注册才能正常工作。
答案 2 :(得分:0)
感谢您的回复。
我添加的清单是从.NET控制台应用程序自动生成的。没有为COM DLL本身生成清单。我将查看演练,看看是否提供了任何答案。