How to return two different variable in c++?

2019-08-24 14:57发布

问题:

dll C++

extern "C"  
{
     __declspec(dllexport) int mainfun()
     {
         return x;
     }
}

In C#

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int mainfun();

I only know how to return and call one variable from C++ to C#. I am writing a program where i need to call two different varables in C# from c++ dll (like return x,y;). Please i need help.

EDIT1:

In C++

struct Point
{
    int count_err;
    int statement;
} obj;
extern "C"  
{
     __declspec(dllexport) Point mainfun()
     {
         return obj;
     }
}

In C#

[StructLayout(LayoutKind.Sequential)] 
public struct Point 
{ 
   public int errsize; 
   public int statmnt; 
} 
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]    
public static extern Point mainfun();

errsize = mainfun();
statmnt = mainfun();

Here errsize is giving an error-"the name 'errsize' does not exist in the current context".. What to do?

EDIT2:

In C#

total_errors.Text = p.errsize.ToString();

giving same error-"the name 'p' does not exist in the current." context"

回答1:

Define new struct or array of data. Something like this:

C++:

struct Point
{
    int count_err;
    int statement;
} obj;
extern "C"  
{
     __declspec(dllexport) Point mainfun()
     {
         return obj;
     }
}

C#:

[StructLayout(LayoutKind.Sequential)] 
public struct Point 
{ 
   public int errsize; 
   public int statmnt; 
} 
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]    
public static extern Point mainfun();

Point p = mainfun();
var errsize = p.errsize;
var statmnt = p.statmnt;


回答2:

First understand that if you want to return more than one value from any function, then you will need an object which can hold multiple values like struct, class object, list etc. But in your case you cannot use LIST or KeyValuePairList of C# because you have direct dependency with C++ code.

So use structure which is same in both the platforms. Now first you need to create a suitable data structure and change the return type of mainfun() when you are calling it as follows..

public struct abc {
    public int a;
    public int b;
}

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern abc mainfun();

Now in your C++ library, add the data structure and change the function definition.

typedef struct {
    int a;
    int b;
} abc;

extern "C"  
{
     __declspec(dllexport) abc mainfun()
     {
         abc obj;
         obj.x = 1;
         obj.y = 2;
         return obj;
     }
}


标签: c# dll