小弟现在要用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 FunctionSub 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中的函数了。
现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误小弟是菜鸟,大哥哥们救命啊。关系饭碗。。

解决方案 »

  1.   

    kason_j(伊松) ( ) 信誉:100    Blog  2007-01-10 15:54:27  得分: 0  
     
     
       GAC看看
      
     
    GAC 是什么啊。小弟愚钝啊。。??
      

  2.   

    先regsvr32注册一下在工程引用里加添加com的引用,会生成一个文件,不知道你那有吗
      

  3.   

    不要放在System32目录,在VS中添加引用,然后直接调用就可以了,.net 框架本来就和语言无关的!
      

  4.   

    只要数据类型匹配就可以了,跟调用Win32的API一样
      

  5.   

    错误应该是在 执行 VB写的dll内部中发生的,是不是跟 内存分配有关系,net下的 内存分配机制和VB6中的不一样
      

  6.   

    VB能做标准dll吗?
    ==================
    可以,我甚至见过不要vb6运行环境dll的可执行文件,我没用过vb6对楼主提不出有益的建议。
    考虑,vb6 的string 与 .net的string 的不同
      

  7.   

    谢谢楼上各位兄弟的热情帮助,我把情况说更清楚些,
    viena(维也纳nn-下潜15米,潜望镜升起) 
    我在VB中编出来的的确是标准的DLL,只是用了改LINK.EXE的方法。
    我在vb中能Private Declare Function mdk5 Lib "mdk5.dll" (ByVal sn as string) As Long
    调用函数就说明了其的确是标准DLLhdt(倦怠) 兄弟说的方向应该是对的。我也觉得是数据类型的差异造成,但就是不知道怎么改jetxia(Thinking&Asking&Studying)兄弟,我觉得vb中能调用mdk5函数,说明了并非dll本身操作内存报错的而应该是
    c#中 mdk5("111111111111"); 时报错的。
      

  8.   

    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);
      

  9.   

    C#改一下函数定义试试 [DllImport("mdd.dll")]
            public static extern int mdk5( IntPtr bstr );IntPtr bstr = StringToBSTR("11111");
    mdk5(bstr);
      

  10.   

    cancerser(都是混饭吃,记得要结帖)兄弟,您的出现让我痛苦流涕啊。。您是vb,c#都通的我大哥级人物啊
    我突然想到了一个新的解决办法,那就是用C#做Dll  ^_^
    兄弟你既然能翻译了mdk5,那么能帮忙翻译下其他几个函数吗?也就是MDK5函数行数的10倍左右5555,小弟真的没辙了。周末前就要交差啊。。cancerser(都是混饭吃,记得要结帖)您在北京吗?搞定的话俺周六请你到我家楼下吃全聚德啊,
    亚运村店。。
      

  11.   

    少了一点
    IntPtr bstr = Marshal.StringToBSTR("11111");
      

  12.   

    用StringBuilder替换string,只用于传出string类型就行了。
      

  13.   

    555555555555感动,,,,,回帖之间,老大们都来的。555555555
    给Knight94(愚翁) ,liujia_0421(SnowLover) ,cancerser(都是混饭吃,记得要结帖),hdt(倦怠) 
    等等大哥们,先磕个头了。。等我一个个试完再上来磕头
      

  14.   

    兄弟们
    我对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);
        }
    }
      

  15.   

    支持IntPtr bstr = Marshal.StringToBSTR("11111");
      

  16.   

    viena(维也纳nn-下潜15米,潜望镜升起) 大大。
    c#俺真的不懂啊。您能帮我加到代码中吗。谢谢啊
      

  17.   

    /*
    cancerser(都是混饭吃,记得要结帖)您在北京吗?搞定的话俺周六请你到我家楼下吃全聚德啊,
    亚运村店。。
    */
    hdt大哥好像离亚运村不远,你可以请他吃全聚德,呵呵~
      

  18.   

    Sample code as follows:
    using System.Text;
    private void button1_Click(object sender, EventArgs e)
    {
    StringBuilder sBuffer = new StringBuilder("111111111111", 256 );
    mdk5( sBuffer );
    }
    [DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
    public static extern int mdk5(StringBuilder sn);
      

  19.   

    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)
            {
                IntPtr bstr = StringToBSTR("111111111111");
                mdk5(bstr);
            }
            [DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
            public static extern int mdk5( IntPtr bstr );
        }
    }
      

  20.   

    少了点东西,汗
            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr bstr = Marshal.StringToBSTR("111111111111");
                mdk5(bstr);
            }
            [DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
            public static extern int mdk5( IntPtr bstr );
        }
      

  21.   

    Knight94(愚翁) 大哥,我按照您的方法代码如下行吗? 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)
            {
                StringBuilder sn = new StringBuilder(256);
                sn="11111111"
                mdk5(sn);
            }
            [DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]        public static extern int mdk5(StringBuilder sn);
        }
    }
      

  22.   

    viena(维也纳nn-下潜15米,潜望镜升起) 兄弟按照您的代码,还是在执行  mdk5(bstr);时报同样的错误。。
    555555555
      

  23.   

    change
    StringBuilder sn = new StringBuilder(256);
    sn="11111111"with
    StringBuilder sn = new StringBuilder( "11111111",256);
      

  24.   

    Knight94(愚翁) 大哥,5555555 代码如下,还是在mdk5(sn);时报同一个错误。。5555555555555
    我的MDK5在VB中可以引用自如啊。难道VB做的所谓的标准DLL真的还有很大局限性???namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                StringBuilder sn = new StringBuilder("11111111", 256);
                mdk5(sn);
            }
            [DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]        public static extern int mdk5(StringBuilder sn);
      

  25.   

    //难道VB做的所谓的标准DLL真的还有很大局限性
    估计差不多,VB做的只是有输出函数的ActiveX DLL,并非真的标准DLL
      

  26.   

    viena(维也纳nn-下潜15米,潜望镜升起)
    不过通过LINK.EXE方法真的可以让c++和vb自己直接用阿。我试验个了。这个DLL在C#中却碰到这么多问题晕啊。。我发现我真的太背啦。。当初偷懒学了已经过时了的VB。
      

  27.   

    你直接在c#中进行调用是否可以,把vb包的那层去掉
      

  28.   

    Knight94(愚翁) ( ) 信誉:110    Blog  2007-1-10 17:50:12  得分: 0  
     
     
       
    你直接在c#中进行调用是否可以,把vb包的那层去掉  
     
    老大,能具体点怎么操作的吗?谢谢
      

  29.   

    你先做个实验,对于输入参数不做任何操作,包括读取,看有没有问题?
    如果有问题可能是向viena 所说的vb作的dll还不是绝对的标准dll。
    改变方法,vb作activex dll c#引用。如果没有问题说明,只是参数类型转换的问题,不知vb6调试可不可以看到变量的具体在内存中的表示,如果可以看看传入的参数和vb标准string有何区别
      

  30.   

    你的问题涉及到了跨语言的技术,如果两种语言都是managed code便可以直接引用!要解决这个问题有两种办法:1,将你的代码转换成managed code.也就是说把VB的代码转换成VB.net的代码!2.将你的VB DLL转换成标准COM. 
      

  31.   

    to 能具体点怎么操作的吗?首先,我认为vb好像无法做标准的dll,做出来的dll好像是com,在c#中不应该用dllimport来引入;其次,你用vb调用dll的部分,可以用c#直接调用,如果像封装,甚至可以做成类库。
      

  32.   

    已经用com搞定,多谢各位兄弟。。谢谢了。。磕头。。
      

  33.   

    哎怎么想用VB写DLL的呢同命相连啊 
    我对C#也不熟悉 ,NND 按排我做 BIZTALK 的RFID中间件
    不知道领导怎么想的郁闷的一米
    而MS的所谓架构师 估计对G2的协议不咋的熟悉