Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by unity_FWoMs60PplfL2A · Feb 02, 2021 at 09:25 AM · c#dllc++interop

Shared memory between c# and c++

I'm working on a project to create a VR sculpting tool voxel based, this project that involved two main process. On Unity I manage the user interaction and the storage of data structure. For the data manipulation I use c++ libraries. The voxel grid is very big, about 4000x4000 voxels, I need more efficiency, this is the reason why I chose to use the c++ dll. I have read more tutorial e docs about the intoroperability berween c# and c++, but I'm still confused about how to implement the comunication from two process. I have to manipulate two structure, one fixed size array of int (c#: int[] -> c++: int[]) and one variable size vector of pointer to a vector (c#: List<IntPtr> -> c++: std::vector<std::vector<int>*>). Up till now, I've been able to read\write from the int[], I have some problem for the second one, I can't add element to the vector from c++ dll, if I add an element from c# I don't have problems to read and write it from c++. The code of the two processes:

 /************    C++  *************/
 #define EXPORT_API __declspec(dllexport) 
 
 //Function to write into a int[] array
 EXPORT_API bool GetIndices(int indices[], int indicesLenght) {
 
     for(int i = 0; i < indicesLenght; i++){
         indices[i] = 10;
     }
 
     return true;
 }
 
 static void* blocksBufferHandle = NULL;
 static void* blocksBufferHandleOriginal = NULL;
 static int blocksBufferVertexCount;
 static std::vector<int*> g_VertexSource;
 
 EXPORT_API void SetBlocksBuffersFromUnity(void* blocksBufferHandleFromUnity, int blocksCount)
 {
     blocksBufferHandle = blocksBufferHandleFromUnity;
     blocksBufferHandleOriginal = blocksBufferHandleFromUnity;
     blocksBufferVertexCount = blocksCount;
 
     
     g_VertexSource.resize(blocksCount);
     for (int i = 0; i < blocksCount; ++i)
     {
         auto *b = new std::vector<int>(16, 5);
         g_VertexSource[i] = b->data();
     }
 }

 /************    C#   *************/
 using System;
 using System.Runtime.InteropServices;
 using System.Collections.Generic;
 using UnityEngine;
 
 
 public class PluginImport : MonoBehaviour
 {
     
     [DllImport("libUnityPlugin", CallingConvention = CallingConvention.Cdecl)]
     public static extern bool GetIndices([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] IntPtr indices, int indicesLength);
 
     [DllImport("__Internal")]
     private static extern void SetBlocksBuffersFromUnity(IntPtr blocks, int blockSize);
 
   
     public int size; //Grid size
 
     void Start() {
       
         int indicesLenght = 10;
         int[] indices = new int[indicesLenght];
 
         GCHandle indicesHandle = GCHandle.Alloc(indices, GCHandleType.Pinned);
         IntPtr addressIndices = indicesHandle.AddrOfPinnedObject();
 
         GetIndices(addressIndices, indicesLenght);
 
         Debug.Log("Indices value: " + (int)indices[0]); //Output: 10 OK
 
         int blocksLength = 10;
         var blocks = new List<IntPtr>();
 
         GCHandle blocksHandle = GCHandle.Alloc(blocks, GCHandleType.Pinned);
         IntPtr addressBlocks = indicesHandle.AddrOfPinnedObject();
         SetBlocksBuffersFromUnity(addressBlocks, blocksLength);
         
         Debug.Log("Block value: " + blocks[o]); //Error
        
 
         indicesHandle.Free();
         blocksHandle.Free();
 
     }
 }

If I try to read the first element Unity of the vector, returns this error, If I print the length of blocks is 0 :

 ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.

I suppose c# doesn’t notice the addition of elements made by c++. For some parts of the code (Setblocksbuffersfromunity) I took the cue from the Unity documentation. I'm working on this code from about 2 month, I tried several solutions, but any worked for the vector. Any suggestions? thanks

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by AlexClifton4 · Apr 05 at 04:30 PM

Instead of using system interops, another option would be to used shared memory - unity could create a memory mapped file, which both unity and the c++ program can write to.

There’s a question on Stack Overflow where someone seems to have this working: (although generic C#, not Unity) https://stackoverflow.com/questions/40237903/shared-memory-synchronization-between-c-and-c-sharp

One thing to note is there may be conflicts if both programs try to read or write at the same time, which is what that question is asking about.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

688 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Using a fixed size pointer in Unity C# with a C++ external function 0 Answers

How to use native C++ classes in Unity 1 Answer

Multiple Cars not working 1 Answer

C++ plugin for Unity “EntryPointNotFoundExeption” 0 Answers

How to get Unity to detect my own touch events 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges