首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

渔翁大哥啊关于C#调用vb写的DLL中函数的有关问题。100分裸体跪等。

2012-02-21 
渔翁大哥啊救命啊,关于C#调用vb写的DLL中函数的问题。。100分裸体跪等。。。小弟现在要用vb(只会vb)写一个加密

渔翁大哥啊救命啊,关于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

热点排行