问题一:在C#中调用了C++生成的dll,其中一个函数系统提示说未将引用应用到对象实例,但是另外的一个函数就是好用的,好用的参数传得是int,出错的是string,会有关系么。(直接用的C,没有使用类)
问题二:再次尝试,使用导出类中函数,不过名字会有变,但是在EntryPoint里做了相应的定义,这次好像是所有的函数都是没有将引用应用到对象实例。这次我估计是没有导出类的关系,只是导出函数,是不是如此类就没有办法实例化?
问题三:如果按类导出,在C#中如何使用?需要先将这个类实例化,然后
        public static extern void chuck(string s);
        ????
问题四:参数到底如何传递,好像没有讲的太明白的帖子,我现在主要考虑string类型的参数拜托各位大侠出手相助了!!!

解决方案 »

  1.   

    新的进展!
    其中一个同样传string的函数是可以用的,但是别的不可以,而且他们也都调用了没有导出来的变量和函数。但是不能用的就被系统说“未将对象的引用设置到对象实例”,dll是c语言写的,没有对象的概念啊,应该是哪里的问题
      

  2.   

    题一:在C#中调用了C++生成的dll,其中一个函数系统提示说未将引用应用到对象实例,但是另外的一个函数就是好用的,好用的参数传得是int,出错的是string,会有关系么。(直接用的C,没有使用类)
    ====
    1 string 注意编码以及字符串长度,因为C# string 是unicode,而c++不一定,且c++一般用\0来确定字符串的结尾。问题二:再次尝试,使用导出类中函数,不过名字会有变,但是在EntryPoint里做了相应的定义,这次好像是所有的函数都是没有将引用应用到对象实例。这次我估计是没有导出类的关系,只是导出函数,是不是如此类就没有办法实例化?
    ====
    c++ 中的类,除了c++ 别的语言基本使用不了,就连不同的c++编译器,都不一定通用,除非用com
    问题三:如果按类导出,在C#中如何使用?需要先将这个类实例化,然后
            public static extern void chuck(string s);
            ????
    ====
    同三问题四:参数到底如何传递,好像没有讲的太明白的帖子,我现在主要考虑string类型的参数
    ====
    看看msdn
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmarshalingstrings.htm
    注意装msdn2003,
      

  3.   

    找到了一点原因,好像参数传不过去,看以下两个函数
    void _stdcall chuck(string s)
    {
    printf("string into chuck is:\n%s\n",s);
             .......
    }
    void _stdcall wolfhome(string f3)
    {
    printf("string into wolfhome start is:%s\n",f3);
             .......
    }
    c#中的调用如下
    [DllImport("bear.dll",CallingConvention=CallingConvention.StdCall)]
    public static extern void chuck([MarshalAs(UnmanagedType.LPStr)] string s);
    [DllImport"bear.dll",CallingConvention=CallingConvention.StdCall)]
    public static extern void wolfhomeseal([MarshalAs(UnmanagedType.LPStr)]string s);按理说传参数应该是同样的处理方式,但是在控制台上打印出来的是
    string into chuck is:
    asd24esd
    string into wolfhome start is:?输入的两个字符串依次为"asd24esd"和"howdoyoudo"
    也就是说同样的结构,传参数的时候,chuck正常,但是wolfhome传了一个"?"过去,这是怎么回事?