标签: regfreecom

为免注册COM生成清单文件

我有一些应用程序(一些本机,一些.NET)使用清单文件,以便它们可以完全隔离部署,而无需任何全局COM注册.例如,在myapp.exe.manifest文件中声明对dbgrid32.ocx com服务器的依赖关系如下,该文件与myapp.exe位于同一文件夹中:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="myapp.exe" version="1.2.3.4" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
    </dependentAssembly>
  </dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

dbgrid32.ocx与它自己的dbgrid32.ocx.manifest文件一起部署到同一文件夹:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
  <file name="dbgrid32.ocx">
     <typelib
        tlbid="{00028C01-0000-0000-0000-000000000046}"
        version="1.0"
        helpdir=""/>
    <comClass progid="MSDBGrid.DBGrid"
       clsid="{00028C00-0000-0000-0000-000000000046}"
       description="DBGrid  Control" />
  </file>
</assembly>
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但手动维护这些清单文件有点痛苦.有没有办法自动生成这些文件?理想情况下,我只想声明应用程序对COM服务器列表(本机和.NET)的依赖性,然后自动生成其余部分.可能吗?

com dll manifest typelib regfreecom

84
推荐指数
4
解决办法
5万
查看次数

使用OCX而不注册它

是否可以在winform上使用ocx(ActiveX控件)(可能以编程方式添加它),而不首先在regsrv32中注册ocx?

我想要实现的是启用xcopy安装.我有从我的开发机器生成的"AxInterop .dll"和"Interop .dll"文件.

我已经看到了在没有先注册它的情况下调用COM dll的可能性(ProSysLib,据作者说,但我还没有测试过),因为ocx也是基于COM的,所以我认为必须有一些方法来也这样做.

.net com ocx regfreecom

29
推荐指数
2
解决办法
1万
查看次数

是否有人成功使用免费注册COM与.NET组件?

直到最近,我们还很高兴地使用免注册COM作为我们的原生和.NET COM组件.然而,我们遇到了一个奇怪的问题,我们的应用程序开始在Windows XP SP3上随机崩溃(但不是在Vista上),因为我们只更改了.NET程序集的版本号以从候选版本迁移到发布版本.(难道你不讨厌墨菲定律吗?)

经过多次失败的人工和磨牙之后,我们发现问题是sxs.dll中的一个已知错误,它在检索有关.NET类的信息时会导致堆损坏.有一个热修复使问题消失,但热修复不打算重新分配.

我们有点难过在免注册COM实现中存在这样一个可怕的错误.是否有人成功使用免注册COM for .NET组件?你是怎么解决这个问题的?

.net com winsxs sxs regfreecom

21
推荐指数
1
解决办法
3783
查看次数

在Windows 7上使用VB6注册Free Com

我有一些从VB6代码中使用的.NET代码.我一直在XP机器上通过创建一个列出依赖.NET程序集的VB6.exe.manifest文件来开发它.

例如,假设我的2个.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,这里是VB6.EXE.manifest的样子(我使用的是version = 1.1.0.0,因为那是版本我在AssemblyInfo.cs中设置了.NET AssemblyVersion:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

<?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>
Run Code Online (Sandbox Code Playgroud)

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

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

"ActiveX组件无法创建对象."

在XP上,它成功了.如果我故意拼错VB6.EXE.manifest中的Dependent组件 - 在XP上我得到了

"此应用程序无法启动,因为应用程序配置不正确.重新安装应用程序可能会解决此问题." …

.net c# vb6 interop regfreecom

16
推荐指数
1
解决办法
3244
查看次数

你如何强制VB6使用app目录中的DLL和OCX?

我想将我的依赖文件放在app目录中.

我似乎记得你可以强制VB6只使用本地目录中的文件.

任何提示?

vb6 regfreecom

15
推荐指数
5
解决办法
1万
查看次数

清单中需要哪些标签才能免费注册COM?

TL; DR是否所有生成的注册表项都regsvr32需要出现在SxS reg-free-COM清单中,反之亦然?


我正在尝试获得免注册的COM用于第三方组件.

关于主题,我发现有提到的几个要素,即可以放入一个清单:

从文档中,我们可以将以下标记添加到清单中以描述COM组件:

  • assemblyIdentity- 据我所知,这真的只是描述了"抽象集会 "
  • comClass - 描述COM类(IID接口).看来,这总是需要的.
  • typelib - 什么时候?
  • comInterfaceExternalProxyStub - 什么时候?
  • comInterfaceProxyStub - 什么时候?

从其他文档HKEY_LOCAL_MACHINE\SOFTWARE\Classes我们可以看到COM注册表项有几个类别:

使用regsvr42来提取我试图注册的dll会产生一个只包含comClass条目,没有typelib或ProxyStub条目的清单.(我交叉检查写的密钥,有问题的DLL pdm.dll,MS的Process Debug Manager只写那些密钥,也就是说,注册表中没有明显的类型库或代理存根信息.)

如果注册表只包含与此相关的信息,comClass则表示此信息在SxS清单中是足够的,或者清单中是否需要其他信息?


另外,我注意到注册表包含a VersionIndependentProgId和a ProgId,其末尾附加了版本号.清单只有一个ProgId条目,文档说明:

progid:与COM组件关联的与版本相关的编程标识符.ProgID的格式是 <vendor>.<component>.<version>.

但文档也说明了这一点

comClass元素可以有<progid>...</progid>子元素,其中列出的版本有关的ProgID.

并且他们说 progid属性应该是版本独立的属性.

那么,放在这里的是什么?当客户端没有请求特定版本时,它是否重要?

c++ com manifest side-by-side regfreecom

15
推荐指数
1
解决办法
2279
查看次数

运行时错误-2146234341(8013101b)使用清单从VB.NET到VB6的自动化错误?

我试图在无reg的情况下从VB6客户端访问VB.NET DLL(.NET FX 4.0).

我尝试按照http://msdn.microsoft.com/en-us/library/ms973915.aspx中的示例进行操作,但没有成功.我下载了(文章中的链接)源代码并编译,没有成功(错误信息:运行时错误'-2146234341(8013101b)':自动化错误").从VB6 IDE运行使用注册的VB.NET DLL工作.

我尝试了其他示例,其中.NET DLL被创建为COM类(使用VS2010中的"COM类"模板),嵌入或未嵌入引用DLL的清单,但没有任何对我有用.

有人可以提供一些简单的源代码,在VB6客户端中使用VB.NET DLL(.NET FX v4)的清单示例吗?

非常感谢提前.

vb.net vb6 .net-4.0 regfreecom

11
推荐指数
1
解决办法
3956
查看次数

RegFree COM来自C#,不在VBA工作

我正在尝试使用Excel作为客户端,以及作为服务器的.NET dll,使用免注册COM.目前我只是试图让概念验证工作,但我遇到了麻烦.

显然,当我使用Excel时,我不能简单地使用与可执行文件一起生成的客户端清单,所以我正在使用Microsoft.Windows.ActCtx(链接)

我将客户端清单,程序集清单和dll都放在同一位置.

不幸的是,在C#中工作的东西似乎不适用于Excel/VBA,我很难理解.虽然C#测试客户端工作正常,但VBA发出80070002错误,对象'IActCtx'的消息方法'CreateObject'失败.

我有一个.NET DLL(COMTestService.dll)暴露COM(COMTestObject/ ICOMTestObject)的单个类/接口,如下所示:

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("EEE50CDF-D8EC-4F38-B986-C231EC45171E")]
public interface ICOMTestObject
{
    [ComVisible(true)]
    string GetString(int number);
}

[ComVisible(true), ClassInterfaceAttribute(ClassInterfaceType.None), ComDefaultInterface(typeof(ICOMTestObject))]
[Guid("6E54611B-8B56-49E0-9415-E59B0774A4BE")]
public class COMTestObject : ICOMTestObject
{
    public COMTestObject()
    {
    }

    public string GetString(int number)
    {
        return string.Format("The number is: {0}", number);
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端清单(COMTestService_Client.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly 
    manifestVersion="1.0" 
    xmlns="urn:schemas-microsoft-com:asm.v1" >
    <assemblyIdentity
        name="client"
        version="1.0.0.0" />
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                name="COMTestService"
                version="1.0.0.0" 
                processorArchitecture="msil" /> …
Run Code Online (Sandbox Code Playgroud)

.net com vba side-by-side regfreecom

10
推荐指数
1
解决办法
2153
查看次数

Regfree COM事件从其他线程失败

我有一个COM可见的.NET类,它暴露事件并从VB6使用.在过去的几天里,我一直试图让这个与regfree COM一起工作,但没有成功.

  • 当从原始线程触发事件时,VB6事件以regfree模式运行.
  • 当注册了类型库时,VB6事件在从另一个线程触发时运行.(regasm/tlb/codebase后跟regasm/codebase/unregister,后者不注销tlb)

在regfree模式下从另一个线程触发时,它会抛出异常,因此永远不会执行VB6事件代码.

System.Reflection.TargetException: Object does not match target type.

   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
   at Example.Vb6RegFreeCom.IExampleClassEvents.TestEvent()
   at Example.Vb6RegFreeCom.ExampleClass.OnTestEvent(Action func) in ExampleClass.cs:line 78
Run Code Online (Sandbox Code Playgroud)

我可以想到两种情况:1)清单缺少与tlb注册相关的内容,或者2)创建新线程时激活上下文丢失.不幸的是,我不知道如何找出是哪种情况,或者甚至可能是由其他东西引起的.

以下是显示我的问题的基本示例.

清单(VB6可执行文件)

<?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:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity name="VB6COM" …
Run Code Online (Sandbox Code Playgroud)

.net c# vb6 com regfreecom

10
推荐指数
1
解决办法
1137
查看次数

VB6中的远程调试

是否可以远程调试在VB6之外启动的进程?

该应用程序是一个VB6应用程序,具有相当多的dll/ocx资源.我正在尝试使用VB6应用程序的免注册COM设置ClickOnce部署,但在执行时遇到错误.

我对VB6重定向COM注册的方式的理解可能意味着这是不可能的,但我认为有人可能有更好的想法.

vb6 clickonce regfreecom

9
推荐指数
2
解决办法
4596
查看次数

标签 统计

regfreecom ×10

com ×6

.net ×5

vb6 ×5

c# ×2

manifest ×2

side-by-side ×2

.net-4.0 ×1

c++ ×1

clickonce ×1

dll ×1

interop ×1

ocx ×1

sxs ×1

typelib ×1

vb.net ×1

vba ×1

winsxs ×1