- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想写一个 WinMerge 插件来将 SQLite 数据库翻译成文本,这样我就可以使用 WinMerge 来比较数据库。
我已经用 C# 编写了代码来进行转换,但我似乎无法使其显示为 WinMerge 插件。但我不太熟悉编写 COM 可见的 .NET 对象。
我认为我一定没有放入正确的 COM 属性(我只是将 ComVisible(true) 放入类中)。但是,我认为 VB.Net 应该为您完成所有这些工作,所以我使用 Project/Add New/COM 类在 VB.Net 中重写了类。但是,它仍然没有作为加载的插件出现在 WinMerge 中。
无奈之下,我尝试使用 DLL 导出查看器查看 VB DLL,但它没有显示任何导出的函数。我显然做错了什么。
完整代码如下:
<ComClass(WinMergeScript.ClassId, WinMergeScript.InterfaceId, WinMergeScript.EventsId)> _
Public Class WinMergeScript
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "9b9bbe1c-7b20-4826-b12e-9062fc4549a0"
Public Const InterfaceId As String = "b0f2aa59-b9d0-454a-8148-9715c83dbb71"
Public Const EventsId As String = "8f4f9c82-6ba3-4c22-8814-995ca1050de6"
#End Region
Dim _connection As SQLite.SQLiteConnection
Dim _output As IO.TextWriter
Dim _error As Long
Dim _errordesc As String
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
Public ReadOnly Property PluginEvent() As String
Get
PluginEvent = "FILE_PACK_UNPACK"
End Get
End Property
Public ReadOnly Property PluginDescription() As String
Get
PluginDescription = "Display Sqlite Databases in tab-delimited format"
End Get
End Property
Public ReadOnly Property PluginFileFilters() As String
Get
PluginFileFilters = "\.db$"
End Get
End Property
Public ReadOnly Property LastErrorNumber() As Long
Get
LastErrorNumber = _error
End Get
End Property
Public ReadOnly Property LastErrorString() As String
Get
LastErrorString = _errordesc
End Get
End Property
Public Function UnpackFile(ByVal fileSrc As String, ByVal fileDst As String, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean
On Error GoTo CleanUp
subcode = 1
_error = 0
_errordesc = ""
Using connection As New SQLite.SQLiteConnection("Data Source=" + fileSrc + ";Version=3;DateTimeFormat=ISO8601;")
_connection = connection
Using output As New IO.StreamWriter(fileDst)
_output = output
For Each table As DataRow In Query("Select name from sqlite_master where type = 'table' order by name")
Dump(table(0).ToString())
Next
End Using
End Using
bChanged = True
UnpackFile = True
Exit Function
CleanUp:
_error = Err().Number
_errordesc = Err().Description
bChanged = False
UnpackFile = False
End Function
Sub Dump(ByVal tablename As String)
Dim reader As IDataReader
Using cmd As New SQLite.SQLiteCommand(_connection)
cmd.CommandText = "Select * from """ + tablename + """"
cmd.CommandType = CommandType.Text
reader = cmd.ExecuteReader()
Using reader
_output.WriteLine("==== " + tablename + " ====")
Dim data(reader.FieldCount) As String
For i As Integer = 0 To reader.FieldCount - 1
data(i) = reader.GetName(i)
Next
Dump(data)
While reader.Read()
For i As Integer = 0 To reader.FieldCount - 1
data(i) = reader.GetValue(i).ToString()
Next
Dump(data)
End While
End Using
End Using
End Sub
Sub Dump(ByVal data() As String)
_output.WriteLine(String.Join(vbTab, data))
End Sub
Function Query(ByVal sql As String) As DataRowCollection
Dim cmd As SQLite.SQLiteCommand
cmd = _connection.CreateCommand()
Using cmd
cmd.CommandText = sql
Using da As New SQLite.SQLiteDataAdapter(cmd)
Dim dt As New DataTable()
da.Fill(dt)
Query = dt.Rows
End Using
End Using
End Function
End Class
最佳答案
我刚刚查看了 WinMerge 2.14.0 的实际代码,我认为它只适用于真正的 COM DLL(和 OCX),主要是因为它在不期望注册 COM 对象的情况下工作。它需要扩展到至少引用 .TLBs 或调整为允许不指定路径,但比“WinMergeScript”更明确的 ID。
在工作的 VB.NET COM 对象中,我明确提到 <ComVisible(True)> _
并且该项目在编译属性中选中了“为 COM 注册”。
我刚刚创建了一个 HelloWorld
函数使用你的代码,用 vbc /t:library
编译它并用 regasm /codebase
注册.这是使用这个简单的 vbscript 成功调用的(使用 wscript
):
Option Explicit
Dim so
Set so = CreateObject("SO13035027.WinMergeScript")
MsgBox so.HelloWorld
以及整个代码(我没有重新配置我的系统以使用更高版本的 vbc
所以它实际上被编译为 .NET 1.1):
Option Explicit On
Option Strict On
'Option Infer On
Imports Microsoft.VisualBasic
Namespace SO13035027
<ComClass(WinMergeScript.ClassId, WinMergeScript.InterfaceId, WinMergeScript.EventsId)> _
Public Class WinMergeScript
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "9b9bbe1c-7b20-4826-b12e-9062fc4549a2"
Public Const InterfaceId As String = "b0f2aa59-b9d0-454a-8148-9715c83dbb72"
Public Const EventsId As String = "8f4f9c82-6ba3-4c22-8814-995ca1050de2"
#End Region
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
Public Function HelloWorld() As String
Return "Hello, world!"
End Function
End Class
End Namespace
关于c# - 如何用 C#(或 VB.NET)编写 WinMerge 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13035027/
我开始使用 WinMerge。我希望看到行号以便在文件中轻松导航。我找不到选项。 有人知道我可以在哪里打开它,或者有可能吗? 最佳答案 Menu > View > View Line Numbers
TL;DR:我如何才能自动对所有差异结果应用 PrediffLineFilter,而不是仅对打开的文件手动应用? WinMerge 2.16.4.0 支持使用插件 prediffers 等 diff,
动机:我正在重写一个文档——稍后要处理的文本文件。新源现在使用 UTF-8。大部分来源是相同的。我需要找到差异。 详细信息:旧的文档源使用 cp1250 编码,新源使用 UTF-8。新旧源都使用相同的
当我比较2个大文件时 我用了winmerge这是一个很好的工具,可以找到2个文件之间的差异 就我而言 2个文件中的每一个几乎包含3000行 而且有些行只包含更改 有什么办法可以使两个文件中的相同行在比
我正在使用 WinMerge 来比较文件夹(包括子文件夹)中的 java 文件。我想在比较完成后忽略评论,但我不知道该怎么做。 在文件级别,我在选项中找到了一个开关,因此如果我比较两个文件,注释将被忽
使用 WinMerge 时,我正在查看一个文件,该文件已将一段代码插入函数中,这会导致文件的其余部分在比较中不同步。我的要复杂得多,但与下面的简单示例基本相同: FILE 1
我想使用 winmerge 合并两个包含 android 项目的目录。我只想合并源文件(.java),资源文件(布局/值/可绘制) 任何人都可以帮助我了解 fileter 的规则。这是我第一次使用 w
我有一个代码目录结构,它是这样的: modudle1 trunk pom.xml branches 1.1 pom.xml modudl
我有很多文件包含以下类型的行 - * @version $Revision: 1.xxx 我希望在使用 winmerge 进行比较时忽略这种类型的行。我尝试过使用线路过滤器。但是,直到无法做到这一点
我已经阅读了关于这个主题的大量问答,并严格按照所有说明进行操作。但是,尝试使用 WinMerge 将 Git 设置为比较和 merge 时,我仍然感到头疼。 我使用 Git 终端执行了以下步骤: gi
我喜欢用 WinMerge而不是使用 TortoiseSVN 的 TortoiseMerge 来比较文件的不同修订版之间的更改。我可以在 TortoiseSVN 设置(上下文菜单>“TortoiseS
我需要一个助手在 python 中对两个表之间的比较进行编码,目前在 winmerge 中完成。 代码如下 import pandas as pd 上周的表 df1=pd.read_csv(r"C:\
是否有可能仅复制两个文件的差异?就像在 winmerge 中一样,但是,我找不到此选项 就像在这个屏幕上一样 - 我只想复制“黄色部分”。当然我可以手动完成,但在大文件中它不是太有趣:-) 最佳答案
当我在 Windows 平台上用 WinMerge 比较 2 个文件时,你知道我怎么能忽略特定的词吗? 我的意思是我想对 WinMerge 说:“不要在意那些单词列表:房子、花园等。” 比较这两行时,
经过多年的备份和将大量目录从一台计算机复制到另一台计算机后,我的皇室一团糟。 Duplicate finder 软件和 winmerge 想要通过浏览单个文件来解决问题。考虑到问题的规模,搜索或扫描需
我正在尝试使用 WinMerge 递归比较两个 Subversion 工作副本文件夹。 不幸的是,WinMerge 在 Subversion Control 文件夹( .svn 或 _svn )中显示
我试图找到 WinMerge 的替代方案来解决 150% DPI 下的文本模糊问题。虽然我的问题被关闭了(我认为这种心态没有帮助),但我找到了答案所以我分享它。 最佳答案 您可以继续使用 WinMer
我有两个目录,其中包含一些 *.jar 和 *.war 文件,以及一些元数据文件和一个带有 *.spring 扩展名的文件,它实际上只是一个名称奇怪的 zip 文件。像这样的: - dist1
当您在 TortoiseSVN 之后安装 winmerge 时,它会为您提供将 winmerge 与 Tortoise 相关联的选项。但是,如果我们在 winmerge 之后安装 Tortoise
我可以让 winmerge 显示修改文件的差异。但是对于新文件,winmerge 会给出一个对话框,提示“左路径无效!”。我希望它将左 Pane 显示为空,右 Pane 显示文件内容。 $ git d
我是一名优秀的程序员,十分优秀!