Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Basic COM DLL在版本升级时不加载COM.NET程序集_C#_.net_Com_Vb6_Typelib - Fatal编程技术网

C# Visual Basic COM DLL在版本升级时不加载COM.NET程序集

C# Visual Basic COM DLL在版本升级时不加载COM.NET程序集,c#,.net,com,vb6,typelib,C#,.net,Com,Vb6,Typelib,我曾经有一个VisualBasic(VB6)COM DLL(我们称之为“dllouter”),它引用了另一个VisualBasic(VB6)COM DLL(我们称之为“dllinner”)和一个接口“interface”。“dllouter”按以下方式加载“dllinner”: Public objCom As dllinner.Interface Set objCom = New dllinner.Interface 当“dllinner”版本更改时,在“Interface”没有更改的情况

我曾经有一个VisualBasic(VB6)COM DLL(我们称之为“dllouter”),它引用了另一个VisualBasic(VB6)COM DLL(我们称之为“dllinner”)和一个接口“interface”。“dllouter”按以下方式加载“dllinner”:

Public objCom As dllinner.Interface

Set objCom = New dllinner.Interface
当“dllinner”版本更改时,在“Interface”没有更改的情况下,“dllouter”能够毫无问题地加载它,而无需重新编译它

在那之后,我用
[assembly:ComVisible(true)]
将“dllinner”替换为一个C#.NET程序集(VS2015),并重新编译“dllouter”,一切正常

但如果我将
[assembly:AssemblyVersion(“1.0.0”)]
更改为较新的版本,则
Set objCom=New dllinner.Interface
将失败。在更新对新“dllinner”的引用后,我需要重新编译“dllouter”以使其工作

我注意到,将.vbp文件与对Visual Basic“dllinner”和.NET“dllinner”的引用进行比较,GUID后面列出的版本有所不同:

参考=*\G{6B0651C5-5225-42A6-841F032797E5018}{strong>1.00}

用新程序集版本(例如2.0)更新.NET程序集的粗体值,而Visual Basic DLL引用的粗体值保持不变(始终为1.0,无论“dllinner”版本是什么)

因此,我尝试将属性
[assembly:TypeLibVersion(1,0)]
添加到assemblyinfo.cs,这样做“修复”了.vbp中的引用,这意味着无论AssemblyVersion是什么,粗体值都保持为1.0。 但是,问题没有得到解决:“dllouter”仍然无法加载“DLLINER”


是否有办法解决此问题,避免在“dllinner”版本更改时重新编译“dllouter”?

如果希望COM可视程序集与以前的版本兼容,必须:

1) 确保界面中没有可见的更改。如果对已部署的接口进行了更改,则新对象不兼容,必须生成新的CLSID、IID和新的类型库

2) 确保每个可见的类都使用与上一版本相同的IID进行注释。如果您忘记在以前的版本中执行此操作,编译器将为您生成一个,因此您需要找出它是什么,以便新版本可以相同。您可以使用TlbView或注册表来查找这一点

3) 确保每个可创建的类都使用与以前版本相同的CLSID进行注释

检查类型库是否相同也是一个好主意。您可以使用TlbView或类似工具反编译以前版本的类型库,然后对新版本执行同样的操作。你不应该看到任何重要的区别


注意:如果要添加其他函数,可以这样做,但需要为新接口创建一个新的IID,该IID应从旧接口继承(应使用旧IID进行标记)。

如果更改dllinner的公共接口,则这是不可能的。如果您不这样做,那么这应该是可能的。您是否设置了CLSID和接口ID?也就是说,每个类都必须有一个显式设置接口ID的
ComClassAttribute
:如果您不设置它们,编译器会自动生成它们,并且每个版本都会不同。为了兼容,您需要将它们设置为与上一版本相同的值。@Ben我在类前面也丢失了一个显式ID
[Guid(“C0DC113C-3839-4427-8DA5-35D768AFF3D6”)]分部类classInterface:Interface{}除了接口ID之外。现在它可以工作了。我不知道你是想回答这个问题,还是我应该自己回答。