渔翁大哥啊救命啊,关于C#调用vb写的DLL中函数的问题。。100分裸体跪等。。。
小弟现在要用vb(只会vb)写一个加密函数,根据大侠们的方法编译成不用注册的标准dll(这个dll在vb中成功调出mdk5函数)给公司的另外一个同事用(他用C#)
vb代码如下
Private Declare Function GetPhyCode Lib "kspdll.dll " (ByVal prodcode As String, ByVal hostcode As String, ByVal IsNumber As Long, ByVal decode As String) As Long
。。。。。(这个代码中包含引用一个dll和若干给mdk5的函数)。。。
由于太长不让贴身略了。。。
Public Function mdk5(ByVal sn As String) As Long '加密
Dim tempstr2 As String
Dim ssid
hostid = getdiskname( "a ")
ssid = "colakesp "
tempstr2 = Space(12) '分配空间
Call GetPhyCode(ssid, hostid, 1, tempstr2)
ssid2 = Mid(tempstr2, 5, 8)
Dim tempstr3 As String
tempstr3 = Space(12) '分配空间
Call GetPhyCode(ssid2, "e0009999 ", 1, tempstr3)
codetemp = "A01 " & "- " & "e0009999 " & tempstr3
If sn = codetemp Then
mdk5 = 1
Else
mdk5 = 0
End If
End Function
Sub Main()
'确保VB能编译
End Sub
Function DLLMain(ByVal hInstDLL As Long, ByVal fdwReason As Long, ByVal lpwReserved As Long) As Long
DLLMain = 1
End Function
现在要在c#中调用mdk5函数
同事c#中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
mdk5( "111111111111 ");
}
[DllImport( "mdd.dll ", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5(string sn);
}
}
dll放在system32下面了。如果不放在SYSTEM32或c# exe文件同目录的话会报找不到DLL错误,如果函数名故意写错的话C#会先报找不到入口点的错误,这说明了2个问题
1、c#已经找到正确的DLL
2、c#已经找到DLL中的函数了。
现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误
小弟是菜鸟,大哥哥们救命啊。关系饭碗。。
[解决办法]
先regsvr32注册一下
在工程引用里加添加com的引用,会生成一个文件,不知道你那有吗
[解决办法]
VB能做标准dll吗?
[解决办法]
不要放在System32目录,在VS中添加引用,然后直接调用就可以了,.net 框架本来就和语言无关的!
[解决办法]
只要数据类型匹配就可以了,跟调用Win32的API一样
[解决办法]
VB能做标准dll吗?
==================
可以,我甚至见过不要vb6运行环境dll的可执行文件,我没用过vb6对楼主提不出有益的建议。
考虑,vb6 的string 与 .net的string 的不同
[解决办法]
up
[解决办法]
头疼,不爱看代码,如果只想用MD5,我给你c#的写法
public string MD5(string fileName)
{
System.Security.Cryptography.MD5CryptoServiceProvider hashmd5;
hashmd5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
FileStream myStream=System.IO.File.Open(fileName,FileMode.Open,FileAccess.Read);
BinaryReader br=new BinaryReader(myStream);
byte[] myByte=br.ReadBytes((int)myStream.Length);
//return BitConverter.ToString(hashmd5.ComputeHash(System.Text.Encoding.Default.GetBytes(toCryString))).Replace( "- ", " ").ToLower();
br.Close();
myStream.Close();
return BitConverter.ToString(hashmd5.ComputeHash(myByte)).Replace( "- ", " ").ToLower();
}
//如果是为引dll 算我帮顶
[解决办法]
渔翁大哥下午有空,说不定过会就可以来帮你了...
友情帮顶..
[解决办法]
to dll放在system32下面了。如果不放在SYSTEM32或c# exe文件同目录的话会报找不到DLL错误,如果函数名故意写错的话C#会先报找不到入口点的错误,这说明了2个问题
1、c#已经找到正确的DLL
2、c#已经找到DLL中的函数了。
这个问题,如果是win程序的话,只需放到和exe所在目录即可;如果是web程序,在2000系统下,会出现你所说的现象,因此需要放到system32目录下,除此外,别的系统都不会出现类似问题。
to 现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误
用StringBuilder来替换String
调用的时候必须初始化StringBuilder
例如:
StringBuilder sBuffer = new StringBuilder(256);
[解决办法]
Ding