我有一个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 成分
答案 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中),它现在可以完美地工作。