使用c#中的vb6库

时间:2017-07-16 23:41:02

标签: c# .net dll vb6

我有一个VB应用程序调用外部DLL进行地址验证。我需要将此代码添加到C#应用程序中,但我的代码转换未被接受。

VB6代码:

Declare Function UNZ_INIT_EX Lib "UNZDLL32.DLL" () As Long

Declare Function UNZ_TERM Lib "UNZDLL32.DLL" (ByVal hUnz As Long) As Long

Declare Function UNZ_CHECKADDRESS Lib "UNZDLL32.DLL" (ByVal hUnz As Long, ByVal Line1$, ByVal line2$, ByVal line3$, ByVal Line4$) As Long

Declare Sub UNZ_GETSTDADDRESS Lib "UNZDLL32.DLL" (ByVal hUnz As Long, ByVal szFirmName As String, ByVal szPRUrb As String, ByVal szDelLine As String, ByVal szLastLine As String)

Declare Sub UNZ_GETERRORTEXT Lib "UNZDLL32.DLL" (ByVal hUnz As Long, ByVal ErrorText As String)

Declare Function UNZ_GETMATCHCOUNT Lib "UNZDLL32.DLL" (ByVal hUnz As Long) As Long

Declare Sub UNZ_GETMATCHADDR Lib "UNZDLL32.DLL" (ByVal hUnz As Long, ByVal intItem As Integer, ByVal szFirmName As String, ByVal szPRUrb As String, ByVal szDelLine As String, ByVal szLastLine As String)

Declare Sub UNZ_GETAREACODE Lib "UNZDLL32.DLL" (ByVal hUnz As Long, ByVal szAreaCode As String)

C#代码:

using System.Runtime.InteropServices;
[DllImport("unzdll32.dll", CharSet.Auto)]

我开始这样做了:

public static extern long UNZ_INIT_EX();
public static extern long UNZ_TERM(long hUnz);

但是,由于此错误,我无法将此DLL添加为参考:

  

错误:无法添加对...的引用。请确保   该文件是可访问的,并且它是有效的程序集或COM   成分

3 个答案:

答案 0 :(得分:1)

也许还考虑升级到.NET的.NET版本(NetZipCode v4.4 for .NET - http://www.softwarecompany.com/downloads.html)。图书馆里还附带了VB.NET和C#代码示例。

答案 1 :(得分:0)

试试这个:

UINavigationControllers

这是你的代码的直接VB到C#<% Map<int, ArrayList<String>> engines = new Map<int, ArrayList<String>>(); ArrayList<Integer> carList = CarListDAO.getCar(id); for (int c: carList){ ArrayList<String> carEngine = CarListDAO.getCarEngine(c); engines.put(c, carEngine); } %> <script> var engines = <%out.println(JSONObject.valueToString(engines));%>; function showEngines() { var el= document.getElementById('carid'); for(var i=0;i<el.options.length;i++) { if (el.options[i].selected) { bindEngines(el.options[i].value); break; } } } function bindEngines(c) { var el=document.getElementById('carENGINE'); el.options.length = 0; var newOptions= engines[c]; for (i=0; i<newOptions.length; i++) { el.options[el.length] = new Option(newOptions[i], newOptions[i]); } } </script> <div class="cell"> Select Car_Type <div class="input-control"> <select id="carid" name="carid" change="showEngines()"> <option selected disabled>--SELECT CAR TYPE--</option> <% for (int c: carList){ out.println("<option value='" + c + "'>" + c + "</option>"); } %> </select> </div> </div> <div class="cell"> Select Car_Engine <div class="input-control"> <select id="carENGINE" name="carENGINE" disabled> <option selected disabled>--SELECT CAR Engine--</option> </select> </div> </div> ;但应注意,实际上可能需要更改/添加类型或标识符。例如,.NET中的long是一个带符号的64位类型,虽然它足以容纳32位类型,但如果类型需要匹配宽度,则可能会导致DLL出现问题。

您需要知道实际导出的C函数是什么才能生成正确的PInvoke方法。例如,如果[DllImport("UNZDLL32.DLL")] public static extern long UNZ_INIT_EX(); [DllImport("UNZDLL32.DLL")] public static extern long UNZ_TERM (long hUnz); [DllImport("UNZDLL32.DLL", CharSet.Auto)] public static extern long UNZ_CHECKADDRESS(long hUnz, string Line1, string line2, string line3, string Line4); [DllImport("UNZDLL32.DLL", CharSet.Auto)] public static extern void UNZ_GETSTDADDRESS(long hUnz, string szFirmName, string szPRUrb, string szDelLine, string szLastLine); [DllImport("UNZDLL32.DLL", CharSet.Auto)] public static extern void UNZ_GETERRORTEXT(long hUnz, string ErrorText); [DllImport("UNZDLL32.DLL")] public static extern long UNZ_GETMATCHCOUNT(long hUnz); [DllImport("UNZDLL32.DLL", CharSet.Auto)] public static extern void UNZ_GETMATCHADDR(long hUnz, int intItem, string szFirmName, string szPRUrb, string szDelLine, string szLastLine); [DllImport("UNZDLL32.DLL", CharSet.Auto)] public static extern void UNZ_GETAREACODE(long hUnz, string szAreaCode); 的C函数定义如下:

DllImport

然后可以像这样定义C#

UNZ_GETERRORTEX

您还需要确保DLL_EXPORT void UNZ_GETERRORTEXT(long hUnz, _Out_opt_ LPTSTR ErrorText); // or DLL_EXPORT void UNZ_GETERRORTEXT(long hUnz, char* ErrorText) 位于应用程序可以访问的位置(例如,在同一文件夹中)。

希望可以提供帮助。

答案 2 :(得分:-1)

我使用相同的程序。我有一台64位计算机,但仅成功加载NetZipCode.dll,而不是NetZipCode64.dll。我能够添加对NetZipCode.dll和所有Fujitso文件的引用,但是在尝试添加对Unzdll32.dll或Unzdll64.dll的引用时遇到与您相同的错误。用户指南说将它们放入C:\ Windows \ System,但这也不起作用。

我发现如果将Unzdll32.dll放在C:\ Windows \ SysWOW64目录中,它将突然起作用。如前所述,我在64位计算机上使用NetZipCode.dll,因此,基本上,我仅对所有内容成功使用32位版本。但这没关系,因为我想这2个dll需要与匹配的版本配对才能工作。  无论如何,如果将Unzdll32.dll正确地放置在运行应用程序的计算机上(在C:\ Windows \ SysWOW64中),它现在可以完美地工作。