小编rav*_*ven的帖子

文件版本与汇编版本

我有一个.NET(FW 2.0)库,它由COM(vb6)应用程序和.NET应用程序使用.

为COM生成的TLB被注册为由"汇编版本"的前两位组成的版本.例如,1.2.5.7汇编版本成为TLB的1.2版本.这非常不方便,因为有时我想更改第二个数字而不需要重新编译vb6应用程序,但似乎我需要在TLB版本更改时重新编译.

所以,我开始研究文件/汇编的事情,并尝试使用文件版本来识别我的更改,保持程序集版本不变.

这与.NET应用程序一样按预期工作(即它可以正常工作),但vb6不是这样.如果任何第三个数字不同(例如汇编版本1.0.0.0 /文件版本1.0.2.0),每次我尝试创建一个新对象时,我得到一个"自动化错误-2147024894(0x80070002)".

任何人都可以告诉我为什么会这样,如果有任何解决方法?

编辑:对不起,错误代码错误.我不知道438来自哪里,但我发誓我看到它...

编辑(2010-09-14):奇怪的是,如果我用汇编版本1.0.0.0编译,那么即使我重新编译vb6项目,我也得到了"自动化错误".

编辑(2010-09-14,再次):在使用ProcMon和FileMon检查后,在违规代码中似乎没有任何文件访问权限,只有注册表查询,大多数指的是DLL的其他版本.它似乎尝试从1.0.0.0(这是最新的代码)到1.0.1.3的所有先前版本,但不是下一个版本(1.0.2.0).目前,文件版本是1.0.2.1,如果我将程序集版本设置为1.0.2.1,它就可以工作,重新编译并注册它.

编辑(2010-09-15):在GAC中搜索我的.Net DLL版本1.0.1.3时有三个PATH_NOT_FOUND错误(在c:\ windows\assembly\GAC_32,c:\ windows\assembly\GAC_MSILc:\ windows\assembly\GAC)还有一些其他错误(大多数是NAME_NOT_FOUND),但似乎在尝试了几个变种之后找到了所有这些错误.问题似乎是它正在搜索DLL的错误版本.

另一个编辑(2010-09-15,仍然):根据Hans Passant的建议,我已经在背景中执行了fuslogvw的违规代码,这些是它抛出的重要行:

日志: DisplayName = E_DataIndex,Version = 1.0.1.3,Culture = neutral,PublicKeyToken = c322af271028978e(完全指定)

日志: Appbase = file:/// C:/ Archivos de programa/Microsoft Visual Studio/VB98 /

日志: AppName = VB6.EXE

日志:在GAC中搜索失败.

编辑:根据汉斯的回答,我是早期绑定并且已经改变了界面的每个Guid.这似乎有效(是的,我知道,我之前应该尝试过这个)...

编辑(2010-09-17):我找到了原始问题的原因:我没有在注册新的TLB之前取消注册TLB,因为我没有更改UUID,所以它一直在搜索安装的最新版本.当然,我的版本控制系统并不是世界上最好的,但是知道这些陷阱我现在还会继续使用它(我对COM和.NET互操作很新).由于"类型不匹配"似乎是另一个无关的问题,我正在删除信息,如果我自己无法解决,我会打开一个新问题.

.net versioning vb6 com interop

3
推荐指数
1
解决办法
1962
查看次数

是否有可能在.NET库中实现二进制兼容性?

我在COM中可以看到.NET库,它是从vb6应用程序调用的.

如果我添加一些方法并发布新版本(但不要删除或更改现有方法的签名),我希望能够将它安装在生产机器中,并使其正常工作.但是,似乎这种方法不起作用; 我需要重新编译vb6应用程序.

有没有办法实现这个目标?

.net vb6 interop binary-compatibility

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

如何判断表格是否与ShowDialog一起显示?

我正在开发一个不从Button继承的自定义控件.我想从标准按钮实现类似于DialogResult的功能,将FormParent.DialogResult设置为PerformClick上的指定值,然后关闭它.

但是,我需要知道表单是否已使用ShowDialog而不是Show显示(即,如果它是模态窗口).

有没有一种简单的方法来实现这一目标?

.net modal-dialog winforms

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

实现集合的简单方法?

我正在开发一个集合类,它应该实现IEnumerator和IEnumerable.

在我的第一个方法中,我直接实现了它们.现在我已经发现了yield关键字,并且我已经能够简化所有内容,将IEnumerator/IEnumerable接口替换为readonly属性,这些值使用yield在循环中返回IEnumerable.

我的问题:是否有可能以这样的方式使用yield,我可以迭代类本身,而不实现IEnumerable/IEnumerator?

即,我想要一个类似于框架集合的功能:

List<int> myList = new List<int>();
foreach (int i in myList)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

更新:似乎我的问题措辞严厉.我不介意实现IEnumerator或IEnumerable; 我只是认为唯一的方法是使用旧的Current/MoveNext/Reset方法.

.net c# ienumerable ienumerator yield

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

反正有没有在VB6中导出函数(不是类)?

我想从Visual Basic 6创建一个ActiveX DLL,我想从中调用一些公共函数.我将仅从VB6调用此DLL.但是,似乎只有类导出.有没有解决方法?

我知道有一种方法可以使用标准的WINAPI函数从VB6创建DLL.这不是我想要的,因为我必须键入数千个Declare指令,我将失去动态链接,因此我不需要在更改DLL时重新编译应用程序.

我会陈述我的问题,万一有人有更好的主意.我有一堆相对较大的项目,每个项目都有自己的代码,然后我有很多"通用"代码,这些代码在几个项目中使用.将每个文件添加到每个新项目并且必须为每个小的更改重新编译所有文件都是一件烦恼.所以我想创建一个DLL,所以当我开始一个新项目时我只会"添加引用",而不必再担心重新编译(至少是为了进行微小的更改)但是当我发现只有类被导出时我发狂了.

我不介意重新组织类中的代码,但这是一项压倒性的任务:有大约10年的3-4人代码,所以这不是我一夜之间可以做的事情.

vb6 dll activex

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

SqlCommandBuilder没有分配ConnectionString

我在布局视图中使用devexpress XtraGrid来编辑最近创建的数据库行.这是我用来加载数据的代码:

Public Function SetData(ByVal connString As String, ByVal tabla As String) As Boolean
    Dim d As New DataTable
    Dim cmd As New SqlCommand

    Try
        Using conn As New SqlConnection(connString)
            conn.Open()
            cmd.Connection = conn

            m_Tabla = tabla
            If (m_Id = "") Then
                cmd.CommandText = "SELECT * FROM " & m_Tabla
            Else
                cmd.CommandText = "SELECT * FROM " & m_Tabla & " WHERE IdCaptura = '" & m_Id & "'"
            End If

            m_Adapter = New SqlDataAdapter(cmd)
            m_DataSet = New DataSet()
            m_Adapter.Fill(m_DataSet, …
Run Code Online (Sandbox Code Playgroud)

.net sql-server gridview devexpress datasource

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

传递参考变量by-ref或by-val?

这可能看起来像一个愚蠢的问题,甚至是主观的,但我不确定这样做的正确方法是什么.

我有一个接收类并改变它的方法(特别是,它向DataTable添加了一个新列).我理解,使用引用类型,我可以通过值或按引用传递它,在这种情况下行为不会改变.

一方面,我不喜欢添加比需要更多的间接.如果by-val有效,我喜欢使用它.

另一方面,by-ref使我的意图更清晰(虽然方法的名称应该足够了).

我应该使用哪个,为什么?

.net pass-by-reference

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