diff --git a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
index ede85fb7f23683da9c4acc2494f9d69d210c4a87..5dcc9f06fac22b8376f55c15383695f4f562c3b0 100644
--- a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
@@ -49,7 +49,13 @@ namespace Grpc.Core.Internal
         static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
 
         [DllImport("grpc_csharp_ext.dll")]
-        static extern MetadataEntryStruct grpcsharp_metadata_array_get(IntPtr metadataArray, UIntPtr index);
+        static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index);
+
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index);
+
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern UIntPtr grpcsharp_metadata_array_get_value_length(IntPtr metadataArray, UIntPtr index);
 
         [DllImport("grpc_csharp_ext.dll")]
         static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
@@ -82,12 +88,12 @@ namespace Grpc.Core.Internal
             ulong count = grpcsharp_metadata_array_count(metadataArray).ToUInt64();
 
             var metadata = new Metadata();
-            for (ulong index = 0; index < count; index ++)
+            for (ulong i = 0; i < count; i ++)
             {
-                var rawEntry = grpcsharp_metadata_array_get(metadataArray, new UIntPtr(index));
-                string key = Marshal.PtrToStringAnsi(rawEntry.key);
-                var bytes = new byte[rawEntry.valueLength.ToUInt64()];
-                Marshal.Copy(rawEntry.value, bytes, 0, bytes.Length);
+                var index = new UIntPtr(i);
+                string key = Marshal.PtrToStringAnsi(grpcsharp_metadata_array_get_key(metadataArray, index));
+                var bytes = new byte[grpcsharp_metadata_array_get_value_length(metadataArray, index).ToUInt64()];
+                Marshal.Copy(grpcsharp_metadata_array_get_value(metadataArray, index), bytes, 0, bytes.Length);
                 metadata.Add(new Metadata.Entry(key, bytes));
             }
             return metadata;
@@ -106,16 +112,5 @@ namespace Grpc.Core.Internal
             grpcsharp_metadata_array_destroy_full(handle);
             return true;
         }
-
-        /// <summary>
-        /// gprc_metadata from grpc/grpc.h
-        /// </summary>
-        [StructLayout(LayoutKind.Sequential)]
-        private struct MetadataEntryStruct
-        {
-            public IntPtr key;  // const char*
-            public IntPtr value;  // const char*
-            public UIntPtr valueLength;
-        }
     }
 }
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c
index bd0a259593b5467edf0fbcf2237d47e6e048506d..682521446f41da3f7ab881d68f805fa89158a924 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -172,10 +172,22 @@ grpcsharp_metadata_array_count(grpc_metadata_array *array) {
   return (gpr_intptr) array->count;
 }
 
-GPR_EXPORT grpc_metadata GPR_CALLTYPE
-grpcsharp_metadata_array_get(grpc_metadata_array *array, size_t index) {
+GPR_EXPORT const char *GPR_CALLTYPE
+grpcsharp_metadata_array_get_key(grpc_metadata_array *array, size_t index) {
+  GPR_ASSERT(index < array->count);
+  return array->metadata[index].key;
+}
+
+GPR_EXPORT const char *GPR_CALLTYPE
+grpcsharp_metadata_array_get_value(grpc_metadata_array *array, size_t index) {
+  GPR_ASSERT(index < array->count);
+  return array->metadata[index].value;
+}
+
+GPR_EXPORT gpr_intptr GPR_CALLTYPE
+grpcsharp_metadata_array_get_value_length(grpc_metadata_array *array, size_t index) {
   GPR_ASSERT(index < array->count);
-  return array->metadata[index];
+  return (gpr_intptr) array->metadata[index].value_length;
 }
 
 /* Move contents of metadata array */