将 C# 程序的结构共享到 C++ win32 DLL 的最佳实践?

Ehe*_*Tov 5 c# c++ memory struct shared

将 C# 程序的结构内存共享到 C++ win32 DLL 的最佳实践是什么?

我已经在两个 C++ 程序之间使用 Boost 在托管共享内存中使用了结构,效果非常好。我不知道在 C# 程序中填充结构的位置和作为 SNMP 子代理的 C++ DLL 之间实现此目的的最佳方法。

这是 C++ DLL:

//====================           Code Excerpt from the main cpp file              ====================== 
#include "stdafx.h" 
//=================           Here we are setting up the shared memory area   =====================
#pragma data_seg (".SHAREDMEMORY")
    struct sharedData {
     int sharedA;
     int sharedB;
    };
    static sharedData A;

#pragma data_seg() 
#pragma comment(linker,"/SECTION:.SHAREDMEMORY,RWS")

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) 
{ 
     return TRUE; 
} 
//=============================================================================================
//====================== Here we are writing wrappers to the shared memory area ===========================
//=You must declare it as an Extern "C" to prevent name mangling. This is absolutely necessary in order to import it into c#  =
//=============================================================================================
extern "C" __declspec(dllexport) sharedData __stdcall getMyData() 
{
    A.sharedA = 1237;
    A.sharedB = 31337;
     //return gshared_nTest; 
    return A;
} 
extern "C" __declspec(dllexport) void __stdcall setMyData( sharedData buff ) 
{ 
     A = buff; 
}
Run Code Online (Sandbox Code Playgroud)

这是调用 C# 函数:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace sharedMemTestCS
{
    public partial class frmSharedMemTestCS : Form
    {
    struct sharedData {
     int sharedA;
     int sharedB;
    };
    static sharedData A;

    //==============  here we are importing the methods from the win32 dll into the c# console application =================
    [DllImport(@"C:\Documents and Settings\My Documents\Visual Studio 2010\Projects\sharedMemTestCPP\Debug\sharedMemTestCPP.dll")]  
    public static extern sharedData getMyData();  
    [DllImport(@"C:\Documents and Settings\My Documents\Visual Studio 2010\Projects\sharedMemTestCPP\Debug\sharedMemTestCPP.dll")]  
    public static extern void setMyData(int data);

        public frmSharedMemTestCS()
        {
            InitializeComponent();
            //==============  here i am incrementing the value =================

            //== i use a message box so that i can have multiple console applications running at once and it will pause at the messagebox (if i don't click ok)
            //== i do this so i can see the values changing in the shared memory.
            //MessageBox.Show( getMyData().ToString() );
            getMyData();
            //txtBoxA.Text = (getMyData().ToString() );
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            //setMyData( getMyData() + 100 );
            //txtBoxA.Text = (getMyData().ToString() );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息是:

Error 1   Inconsistent accessibility: return type
Run Code Online (Sandbox Code Playgroud)

'sharedMemTestCS.frmSharedMemTestCS.sharedData' 比方法 'sharedMemTestCS.frmSharedMemTestCS.getMyData()' 更难访问 c:\documents and settings\mconrad\my Documents\visual studio 2010\Projects\sharedMemTestCS\sharedMemTestCS\Form1.cs 23 37 sharedMemTestCS

Ben*_*igt 3

共享内存的最佳实践是MemoryMappedFile在 C# 中使用类,在 C++ 中使用CreateFileMapping/ 。MapViewOfFile