diff --git a/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs b/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs
index 8cca2b42e987a..7f9c94638567f 100644
--- a/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs
+++ b/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs
@@ -597,6 +597,8 @@ static NativeMethods()
api_.SessionOptionsAppendExecutionProvider_CUDA, typeof(DSessionOptionsAppendExecutionProvider_CUDA));
SessionOptionsAppendExecutionProvider_CUDA_V2 = (DSessionOptionsAppendExecutionProvider_CUDA_V2)Marshal.GetDelegateForFunctionPointer(
api_.SessionOptionsAppendExecutionProvider_CUDA_V2, typeof(DSessionOptionsAppendExecutionProvider_CUDA_V2));
+ SessionOptionsAppendExecutionProvider_VitisAI = (DSessionOptionsAppendExecutionProvider_VitisAI)Marshal.GetDelegateForFunctionPointer(
+ api_.SessionOptionsAppendExecutionProvider_VitisAI, typeof(DSessionOptionsAppendExecutionProvider_VitisAI));
OrtCreateCUDAProviderOptions = (DOrtCreateCUDAProviderOptions)Marshal.GetDelegateForFunctionPointer(api_.CreateCUDAProviderOptions, typeof(DOrtCreateCUDAProviderOptions));
OrtUpdateCUDAProviderOptions = (DOrtUpdateCUDAProviderOptions)Marshal.GetDelegateForFunctionPointer(api_.UpdateCUDAProviderOptions, typeof(DOrtUpdateCUDAProviderOptions));
OrtGetCUDAProviderOptionsAsString = (DOrtGetCUDAProviderOptionsAsString)Marshal.GetDelegateForFunctionPointer(api_.GetCUDAProviderOptionsAsString, typeof(DOrtGetCUDAProviderOptionsAsString));
@@ -1312,6 +1314,20 @@ IntPtr[] outputValues /* An array of output value pointers. Array must be alloca
public static DSessionOptionsAppendExecutionProvider_TensorRT_V2 SessionOptionsAppendExecutionProvider_TensorRT_V2;
+ ///
+ /// Append a VitisAI EP instance (configured based on given provider options) to the native OrtSessionOptions instance
+ ///
+ /// Native OrtSessionOptions instance
+ /// Native keys instance
+ /// Native values instance
+ /// Native numEntries instance
+ [UnmanagedFunctionPointer(CallingConvention.Winapi)]
+ public delegate IntPtr /*(OrtStatus*)*/ DSessionOptionsAppendExecutionProvider_VitisAI(
+ IntPtr /*(OrtSessionOptions*)*/ options,
+ IntPtr keys, IntPtr values, UIntPtr numEntries);
+
+ public static DSessionOptionsAppendExecutionProvider_VitisAI SessionOptionsAppendExecutionProvider_VitisAI;
+
///
/// Append a CUDA EP instance (configured based on given provider options) to the native OrtSessionOptions instance
///
diff --git a/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs b/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs
index 6e325f7fe9646..bebb7bd92e8bc 100644
--- a/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs
+++ b/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
+using System.Linq;
namespace Microsoft.ML.OnnxRuntime
{
@@ -257,6 +258,56 @@ public void AppendExecutionProvider_CUDA(OrtCUDAProviderOptions cudaProviderOpti
#endif
}
+ ///
+ /// Append a VitisAI EP instance (configured based on given provider options) to the native OrtSessionOptions instance
+ ///
+ /// Native OrtSessionOptions instance
+ /// Native keys instance
+ /// Native values instance
+ /// Native numEntries instance
+ public void AppendExecutionProvider_VitisAI(Dictionary config)
+ {
+#if __MOBILE__
+ throw new NotSupportedException("The VitisAI Execution Provider is not supported in this build");
+#else
+ int count = config.Count;
+ IntPtr[] keyPtrs = new IntPtr[count];
+ IntPtr[] valuePtrs = new IntPtr[count];
+
+ string[] keys = config.Keys.ToArray();
+ string[] values = config.Values.ToArray();
+
+ for (int i = 0; i < count; ++i) {
+ keyPtrs[i] = Marshal.StringToHGlobalAnsi(keys[i]);
+ valuePtrs[i] = Marshal.StringToHGlobalAnsi(values[i]);
+ }
+
+ IntPtr keysNative = Marshal.AllocHGlobal(IntPtr.Size * count);
+ IntPtr valuesNative = Marshal.AllocHGlobal(IntPtr.Size * count);
+
+ Marshal.Copy(keyPtrs, 0, keysNative, count);
+ Marshal.Copy(valuePtrs, 0, valuesNative, count);
+
+ try
+ {
+ UIntPtr numKeys = new UIntPtr((uint)count);
+ NativeApiStatus.VerifySuccess(
+ NativeMethods.SessionOptionsAppendExecutionProvider_VitisAI(
+ handle, keysNative, valuesNative, numKeys));
+ }
+ finally
+ {
+ for (int i = 0; i < count; ++i)
+ {
+ Marshal.FreeHGlobal(keyPtrs[i]);
+ Marshal.FreeHGlobal(valuePtrs[i]);
+ }
+ Marshal.FreeHGlobal(keysNative);
+ Marshal.FreeHGlobal(valuesNative);
+ }
+#endif
+ }
+
///
/// Use only if you have the onnxruntime package specific to this Execution Provider.
///