C# 在Windows 7上使用VB6注册免费Com

C# 在Windows 7上使用VB6注册免费Com,c#,.net,vb6,interop,regfreecom,C#,.net,Vb6,Interop,Regfreecom,我从VB6代码中使用了一些.NET代码。我总是在XP机器上通过创建列出依赖的.NET程序集的VB6.exe.manifest文件来开发此功能 例如,假设我的2.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,下面是VB6.EXE.manifest的外观(我在下面使用版本=1.1.0.0,因为这是我在AssemblyInfo.cs中的.NET AssemblyVersion上设置的版本): 然后,与同一目录中的DLL一起,我有程序集和它们自己的清单

我从VB6代码中使用了一些.NET代码。我总是在XP机器上通过创建列出依赖的.NET程序集的VB6.exe.manifest文件来开发此功能

例如,假设我的2.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,下面是VB6.EXE.manifest的外观(我在下面使用版本=1.1.0.0,因为这是我在AssemblyInfo.cs中的.NET AssemblyVersion上设置的版本):


然后,与同一目录中的DLL一起,我有程序集和它们自己的清单文件。下面是一个示例“Some.Assembly.A.dll.manifest”:


我还对引用的DLL运行
tlbexp
,以创建TLB文件,这就是我在VB6项目文件中引用的内容

我想转到Windows 7 64位计算机。使用相同的方法,当我点击在WIN7机器上实例化.NET对象的VB6代码时,我得到

“ActiveX组件无法创建 对象。”

在XP上,它成功了。如果我故意拼错VB6.EXE.manifest中的依赖程序集-在XP上,我会

“此应用程序无法启动 因为应用程序配置 不正确。请重新安装 应用程序可能会解决此问题。”

在WIN7上,VB6只是加载。这就像它忽略了WIN7上的清单一样,所以我不能在WIN7上使用REG FREE方法加载我的.NET对象。如果我
regasm
DLL,一切正常。

关于如何使VB6在WIN7(64位)上与reg free com一起工作,您有什么想法吗?

您可以尝试在x64操作系统上使用
tlbexp
/win32选项。

您可以使用SxsTrace来帮助调试问题。要启动跟踪,请运行“SxsTrace trace-logfile:SxsTrace.etl”将日志文件转换为可以查看的内容,然后运行“SxsTrace Parse-logfile:SxsTrace.etl-outfile:SxsTrace.txt”

你试过了吗


另一件事是,在Vista/Windows 7上,您可以很容易地运行到UAC中。您检查了吗?

如果您正在为win7计算机重新编译vb6.exe或以其他方式处理它,您应该知道一些较新的开发工具会自动嵌入清单,因此您可能需要检查它(一种快速的方法是在VS中打开可执行文件,并查找id为1的资源RT_清单)。如果有嵌入式清单,则会忽略外部清单,这可能就是为什么在编辑外部manfiest时,不会发生任何事情,也会忽略其内容的原因

除了Erno所说的关于sxstrace的内容(您可以发布从sxstrace获得的结果吗?),如果清单嵌入其中,请确保更新VB6.exe的时间戳,否则请更新VB6.exe.manifest。Vista+Win7缓存清单的内容,并键入根清单的时间戳,以便不会拾取您的本地编辑。
如果sxstrace为您提供空白结果,请更新时间戳并重试。

首先想到的是,值得尝试对.net代码进行签名。可能是在需要签名程序集引用的win7 64位上隐式应用了更高级别的安全性

此外,您可以尝试通过(无特定顺序)缩小问题范围

  • 标记要以管理员身份运行的程序,然后重试
  • 标记要在“xp/win2k兼容模式”下运行的程序
  • 在中运行它(它有一个模拟程序加载的选项,并将记录错误)

祝你好运!

前几天我在进行这种混合调试时,出现了错误:“ActiveX组件无法创建对象。”“我建议你按照本文进行操作,并确保一个简单的示例可以在你的Win7 PC上运行(我认为它可以与regasm一起使用)使用REG FREE位,我研究了以下链接:在这里,

Regasm不仅仅生成TLB或所需的注册表项

例如,它可以基于COM可见类型生成COM可见接口。 例如,当COM visible类型未实现接口时,Regasm将执行此操作

是否有任何COM可见类型未实现接口(或未使用ComDefaultInterfaceAttribute定义COM接口)


如果是这样,这可能是您的问题。

我已经能够使用由创建的清单在Win 7-64中成功地使用VB6中的.Net类。它有一个免费试用版。
别忘了包括您的类所针对的.Net运行时版本。这可能是您的问题,因为Win 7仅预装了.Net 4客户端配置文件。

您是否尝试过简单地在WinXP兼容模式下安装和运行VB6?

我对这一建议寄予厚望,但没有这样的运气。我正在将.Net编译为x86 arcHitArchitecture也是。我用一个RC文件创建指向清单的自己的资源文件,并将其嵌入到dll中。我确实从sxstrace获得空结果,更新VB6.exe的timetstamp是什么意思?如果在资源管理器中导航到该文件,并打开文件属性,则应该有一个“Modified:”显示日期的字段。如果在VB6.exe中更新清单,则应确保此日期也已更新。一种方法是,如果编译器尚未更新,则使用“touch.exe”类型实用程序。您可以找到许多“touch.exe”通过搜索引擎实现Windows,虽然我个人只尝试了UnxUtils中的实现。当你说VB6.exe时,你是说用VB6编写的可执行/dll吗?不是实际的IDE?是的,我只是重复问题中的术语。好的,我实际上是说用VB6 devenv加载IDE.NET dll,这样我就可以调试了有趣的是,当独立的VB6/DLL产生时,我可以加载.NET,而不是在VB6i中调试时得到一个带有SXSTRACE的空跟踪文件。如何检查UAC事件查看器?在最坏的情况下考虑重写VB6代码,它变得明显的VB6应用程序可能不会在Windows上运行。
<?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.1.0.0" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.A"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.B"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
</assembly>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="Some.Assembly.A"
      version="1.1.0.0" />
  <clrClass
      clsid="{F1234567-1234-1234-1234-123456789012}"
      progid="Some.Assembly.A.Class1"
      threadingModel="Both"
      name="Some.Assembly.A.Class1" >
  </clrClass>
  <file name = "Some.Assembly.A.dll" />
</assembly>