我有一个.净DLL(这是用C++编写/CLI)。部分的我想要获得通过。我这样做并登记使用"regasm my.dll /codebase".到目前为止一切顺利。但是然后我改变了一些事情,并版本的数量大变化,再加上我的移动dll到一个不同的文件夹。我再次注册它并看看我COM对象在OLE/COM观众。我看到这样的事情

InprocServer32 [Codebase] = file://c://foo/bar/my.dll
7.0.0.0 [Class] = My.Blah.Class
7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234
7.0.0.0 [RuntimeVersion] = v2.0.50727
7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll
7.0.0.27397 [Class] = My.Blah.Class
7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234
7.0.0.27397 [RuntimeVersion] = v2.0.50727
7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll

问题有关的多个版本:

  1. 因此,我认为,最后一COM物体登记的胜利。不要紧,如果我有我的老的7.0.0.0COM目的注册,7.0.0.27397是一种将创建当我的实例我COM对象,因为我登记了它的最后一次。是正确的?

  2. 哎呀,我没有保持周围的7.0.0.0对象。是否有任何方法来摆脱它吗?是否有任何方式消除所有版本COM对象的其他比去注册和重击它的手?

  3. 只是出于好奇,如果我具体想到的实例化的特定版本的我COM对象是否有任何方式做到这一点吗?(我采用C++如果你想得到代码的例子)。

  4. 是否有任何方法我只能告诉regasm不存的版本数字,因为它似乎只是被塞满的东西我看不到好处是什么。如果我COM对象经历了重大的API改变我只是改变GUID和程序id,对吗?如果我不想要注册的多个版本(我不)。

有帮助吗?

解决方案

我总是把我的COM可见的程序集了一个静态AssemblyVersion(只是这个原因。如果你想拥有的二进制文件标记的版本,利用AssemblyFileVersion代替。

  1. 最后登记的对象胜:-是的
  2. 不是真的。你可以把东西在你会ComRegisterFunction/ComUnregisterFunction归咎于方法自动执行的清理,但是如果你留下的旧版本的粪便的周围,这是唯一的方式。
  3. 你会做不同的组GUID和/或程序id(例如,MyCoClass.1,.2,等)。CoCreateInstance不知道任何有关版本的价值观-他们使用的CLR的活化剂,以确保它载的权利大会。
  4. 没有最好的事情要做的是永远不会改变你的装版本(见上文)。

其他提示

组件,同CLSID应该是兼容的,尤其是如果你仅改变了建立数之间的集会。这里是唯一的 有关 我找到确认这一点,通过谷歌上搜索迅速。

来回答你的问题直接:

  1. 正确的。
  2. regasm/注销
  3. 看看 绑定重定向.
  4. 大概不会。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top