diff --git a/CMakeLists.txt b/CMakeLists.txt
index 11273322898c5b58a7922c8fecf716bfee42b954..d38e06c3e7725263375a16abab15afe881254c92 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,14 +67,15 @@ endif()
 
 # SWIG 
 option(${PROJECT_NAME}_WRAP_CSHARP "Build iMSTK-C# wrapper code and lib" OFF)
+option(${PROJECT_NAME}_SWIG_PINNED_ARRAY "Managed C# arrays using pinning" ON)
+mark_as_advanced(${PROJECT_NAME}_SWIG_PINNED_ARRAY)
 if (${PROJECT_NAME}_WRAP_CSHARP)
   find_package(SWIG REQUIRED)
   set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
   include_directories(${CMAKE_CURRENT_SOURCE_DIR})
 
-  set(CMAKE_SWIG_FLAGS "")
-  set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_SOURCE_DIR}/newton_out)
+  set(cmAKE_SWIG_FLAGS "")
 endif()
 
 # CUDA
diff --git a/Source/CSWrapper/CMakeLists.txt b/Source/CSWrapper/CMakeLists.txt
index 521a10b1dc785f4813bcc71aee7160888c4f9302..fd4eed26f35d49f14df5d6ff86d1608d06788a9c 100644
--- a/Source/CSWrapper/CMakeLists.txt
+++ b/Source/CSWrapper/CMakeLists.txt
@@ -10,6 +10,9 @@ swig_add_library(iMSTKCWrapper
     SOURCES imstkCWrapper.i)
 
 set_target_properties(iMSTKCWrapper PROPERTIES SWIG_COMPILE_OPTIONS "-namespace;imstk")
+if(iMSTK_SWIG_PINNED_ARRAY)
+    set_target_properties(iMSTKCWrapper PROPERTIES SWIG_COMPILE_DEFINITIONS "SWIG_PINNED_ARRAY")
+endif()
 if(iMSTK_USE_OpenHaptics)
     set_target_properties(iMSTKCWrapper PROPERTIES SWIG_COMPILE_DEFINITIONS "iMSTK_USE_OpenHaptics")
 	target_compile_definitions(iMSTKCWrapper PRIVATE iMSTK_USE_OpenHaptics)
diff --git a/Source/CSWrapper/ignored.i b/Source/CSWrapper/ignored.i
index 7f846fd543b991fda6f43416a5d17cb3e83f17fd..4f30dc2f8e4157e93ee9a0709e03d4eaa10ebb02 100644
--- a/Source/CSWrapper/ignored.i
+++ b/Source/CSWrapper/ignored.i
@@ -17,6 +17,7 @@
 %ignore imstk::VecDataArray::cbegin() const; /* fix the multiple-definition problem. */
 %ignore imstk::VecDataArray::end(); /* fix the multiple-definition problem. */
 %ignore imstk::VecDataArray::cend() const; /* fix the multiple-definition problem. */
+%ignore imstk::VecDataArray::setData();
 %ignore imstk::stdSink;
 %ignore imstk::LogManager;
 %ignore imstk::Logger::Logger();
diff --git a/Source/CSWrapper/imstkCWrapper.i b/Source/CSWrapper/imstkCWrapper.i
index 13168ec1eb188b68707f477099d510ab552280a6..59400fbacb3d5809109891709a31bbd99682112e 100644
--- a/Source/CSWrapper/imstkCWrapper.i
+++ b/Source/CSWrapper/imstkCWrapper.i
@@ -186,16 +186,32 @@ namespace std {
 %template(ModuleDriverWeakPtr) std::weak_ptr<imstk::ModuleDriver>;
 %template(SimulationManagerWeakPtr) std::weak_ptr<imstk::SimulationManager>;
 
+#ifdef SWIG_PINNED_ARRAY
+  %csmethodmodifiers imstk::VecDataArray::setValues "public unsafe";
+  %csmethodmodifiers imstk::VecDataArray::getValues "public unsafe";
+#endif
+
 %include "cpointer.i"
 %include "arrays_csharp.i"
-%apply unsigned char INPUT[] {const unsigned char* val}
-%apply int INPUT[] {const int* val}
-%apply float INPUT[] {const float * val}
-%apply double INPUT[] {const double* val}
-%apply unsigned char OUTPUT[] {unsigned char* val}
-%apply int OUTPUT[] {int* val}
-%apply float OUTPUT[] {float * val}
-%apply double OUTPUT[] {double* val}
+#ifdef SWIG_PINNED_ARRAY
+  %apply unsigned char FIXED[] {unsigned char* val}
+  %apply unsigned char FIXED[] {const unsigned char* val}
+  %apply int FIXED[] {int* val}
+  %apply int FIXED[] {const int* val}
+  %apply float FIXED[] {float * val}
+  %apply float FIXED[] {const float * val}
+  %apply double FIXED[] {double* val}
+  %apply double FIXED[] {const double* val}
+#else
+  %apply unsigned char INPUT[] {const unsigned char* val}
+  %apply unsigned char OUTPUT[] {unsigned char* val}
+  %apply int INPUT[] {const int* val}
+  %apply int OUTPUT[] {int* val}
+  %apply float INPUT[] {const float * val}
+  %apply float OUTPUT[] {float * val}
+  %apply double INPUT[] {const double* val}
+  %apply double OUTPUT[] {double* val}
+#endif
 %include "ignored.i"
 %include "modifiers.i"
 %include "type_cast.i"