c++中代码:头文件中定义一个结构:
struct DataBuffer
{
        string dataName;
        long address;
        long size;
};cpp文件中代码如下:
extern "C" __declspec(dllexport) DataBuffer* run(string  inputDataURL, string  runtimeFilePath)
{
        DataBuffer* buffer=(DataBuffer*)malloc(sizeof(DataBuffer));
        int a[10][10]={{1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},
                      {1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},
                      {1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},
                      {1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},
                      {1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10}};
        
        //bufferInfo=new DataBufferInfo(inputDataURL,a[0][0],sizeof(a));
        buffer->dataName=inputDataURL;
        //strcpy(buffer->dataName,inputDataURL);
        buffer->address=(long)a;
        buffer->size=sizeof(a);}
C#中cppdll.cs中代码如下:
public class cppdll
    {
        [DllImport("GFInput.dll", EntryPoint = "run", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr run(string uml, string name);
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct DataBuffer
    {
        string dataName;
        long address;
        long size;
    };c#中Program.cs中代码如下:
static void Main(string[] args)
        {
            string a = "abcde";
            string b = "cdefg";
            IntPtr intp = cppdll.run(a, b);
        }
这只是个测试程序,在运行时总是在IntPtr intp = cppdll.run(a, b)处抛出异常:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。烦请各位不吝赐教,告诉小弟应该如何修改,如何调用c++的dll。在此先谢过了各位了。

解决方案 »

  1.   


    string dataName;
      long address;
    c++ 要为c#提供调用,最好不要用string而用char*
    win32平台下
    long 在c++中是32位的,不是64位
    long 在c#中是64位的
      

  2.   

    如果extern "C" __declspec(dllexport) DataBuffer* run(string inputDataURL, string runtimeFilePath)这个函数的返回值要作为另一函数extern "C" __declspec(dllexport) bool Run(DataBuffer* outputData,char*  inputDataURL, char*  runtimeFilePath)的参数,在c#中应该怎么生命和调用。谢谢了
      

  3.   

    unsafe bool Run(DataBuffer* outputData,string inputDataURL, string runtimeFilePath)
    or
    bool Run(out DataBuffer outputData,string inputDataURL, string runtimeFilePath)
      

  4.   

    例如extern "C" __declspec(dllexport) DataBuffer* run(char*  inputDataURL, char*  runtimeFilePath)这个函数,在C#中定义如下:
    public static extern IntPtr run(string uml, string name);
    调用如下:
    IntPtr intp = cppdll.run(a, b);
    对于extern "C" __declspec(dllexport) bool Run(DataBuffer* outputData,char* inputDataURL, char* runtimeFilePath)函数,我如何在c#中定义,又如何将intp作为参数传递给该函数。
    谢谢了!
      

  5.   

    支持这个回答。
    另外不要用malloc,会造成内存泄漏。