diff --git a/cmake/external/onnx_protobuf.natvis b/cmake/external/onnx_protobuf.natvis
new file mode 100644
index 0000000000..ee32395d20
--- /dev/null
+++ b/cmake/external/onnx_protobuf.natvis
@@ -0,0 +1,291 @@
+
+
+
+
+ {{ size={current_size_} }}
+
+ - current_size_
+ - total_size_
+ - arena_or_elements_
+
+ current_size_
+ ($T1*)arena_or_elements_
+
+
+
+
+ {{ size={current_size_} }}
+
+ - current_size_
+ - total_size_
+ - arena_
+
+ current_size_
+ ($T1**)rep_->elements
+
+
+
+
+
+ {{ {*($T1*)ptr_} }}
+
+
+
+
+
+
+ {{ {key_.tagged_ptr_}:{value_.tagged_ptr_} }}
+
+ - key_.tagged_ptr_
+ - value_.tagged_ptr_
+
+
+
+
+ {{ tensor_name={tensor_name_.tagged_ptr_} }}
+
+ - tensor_name_.tagged_ptr_
+ - quant_parameter_tensor_names_
+
+
+
+
+
+ {{ name={name_.tagged_ptr_} }}
+
+ - name_.tagged_ptr_
+ - type_
+ - _has_type()
+
+
+
+
+ {{ domain={ domain_.tagged_ptr_ }, version={ version_ } }}
+
+
+
+
+
+
+
+
+
+ {{ name={ name_.tagged_ptr_ }, type={ (AttributeProto_AttributeType)type_ } }}
+
+ - name_.tagged_ptr_
+ - (AttributeProto_AttributeType)type_
+ - i_
+ - ints_
+ - f_
+ - floats_
+ - s_.tagged_ptr_
+ - strings_
+ - t_
+ - tensors_
+ - t_
+ - graphs_
+ - t_
+ - type_protos_
+ - sparse_tensor_
+ - sparse_tensors_
+ - ref_attr_name_.tagged_ptr_
+ - doc_string_.tagged_ptr_
+ - _has_tensor()
+ - _has_graph()
+ - _has_type_proto()
+ - _has_sparse_tensor()
+
+
+
+
+ {{ name={ name_.tagged_ptr_ }, domain={ domain_.tagged_ptr_ } }}
+
+ - name_.tagged_ptr_
+ - domain_.tagged_ptr_
+ - op_type_.tagged_ptr_
+ - input_
+ - output_
+ - attribute_
+
+
+
+
+ {{ name={ name_.tagged_ptr_ }, domain={ domain_.tagged_ptr_ } }}
+
+ - opset_import_
+ - input_
+ - output_
+ - node_
+ - doc_string_.tagged_ptr_
+
+
+
+
+ {{ name={ name_.tagged_ptr_ } }}
+
+ - name_.tagged_ptr_
+ - value_info_
+ - input_
+ - output_
+ - node_
+ - initializer_
+ - sparse_initializer_
+ - doc_string_.tagged_ptr_
+
+
+
+
+ {{ producer={producer_name_.tagged_ptr_}, domain={ domain_.tagged_ptr_ } }}
+
+ - opset_import_
+ - metadata_props_
+ - producer_version_.tagged_ptr_
+ - ir_version_
+ - model_version_
+ - doc_string_.tagged_ptr_
+ - graph_
+
+
+
+
+ empty
+ {{ v = {value_.dim_value_} }}
+ {{ p = {value_.dim_param_.tagged_ptr_} }}
+
+
+
+
+
+ {{ size={ dim_.current_size_ } }}
+
+ - dim_
+
+
+
+
+
+ {{ type={ (ValueCase)*_oneof_case_ } }}
+
+ - (ValueCase)*_oneof_case_
+ - value_.tensor_type_
+ - value_.sequence_type_
+ - value_.map_type_
+ - value_.sparse_tensor_type_
+ - value_.optional_type_
+ - denotation_.tagged_ptr_
+
+
+
+
+
+ {{ elem_type={ (TensorProto_DataType)elem_type_ } }}
+
+ - (TensorProto_DataType)elem_type_
+ - shape_
+ - _has_shape()
+
+
+
+
+
+ {{ elem_type={ *elem_type_ } }}
+
+ - elem_type_
+ - _has_element_type()
+
+
+
+
+
+ {{ key_type={ (TensorProto_DataType)key_type_ } }}
+
+ - (TensorProto_DataType)key_type_
+ - value_type_
+ - _has_value_type()
+
+
+
+
+
+ {{ elem_type={ (TensorProto_DataType)elem_type_ } }}
+
+ - (TensorProto_DataType)elem_type_
+ - shape_
+ - _has_shape()
+
+
+
+
+
+ {{ elem_type={ *elem_type_ } }}
+
+ - elem_type_
+ - _has_element_type()
+
+
+
+
+
+ {{ begin={ begin_ }, end={ end_ } }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ name={name_.tagged_ptr_}, data_type={ (TensorProto_DataType)data_type_ } }}
+
+ - name_.tagged_ptr_
+ - (TensorProto_DataType)data_type_
+ - 1
+ - _shape_size_1()
+ - _shape_size_2()
+ - _shape_size_3()
+ - _shape_size_4()
+ - _shape_size_5()
+ - dims_
+ - float_data_
+ - int32_data_
+ - int32_data_
+ - int32_data_
+ - int32_data_
+ - int64_data_
+ - int64_data_
+ - uint64_data_
+ - double_data_
+ - string_data_
+ - (std::string*)(raw_data_.tagged_ptr_.ptr_)
+ - (TensorProto_DataLocation) data_location_
+ - external_data_
+ - _has_raw_data()
+ - _has_data_location()
+ - _has_segment()
+
+
+
+
+
+
+ {{ SparseTensorProto }}
+
+ - dims_
+ - values_
+ - indices_
+ - _has_values()
+ - _has_indices()
+
+
+
\ No newline at end of file
diff --git a/cmake/onnxruntime_graph.cmake b/cmake/onnxruntime_graph.cmake
index 8afb54d2a1..35215714c6 100644
--- a/cmake/onnxruntime_graph.cmake
+++ b/cmake/onnxruntime_graph.cmake
@@ -87,6 +87,15 @@ endif()
onnxruntime_add_static_library(onnxruntime_graph ${onnxruntime_graph_lib_src})
add_dependencies(onnxruntime_graph onnx_proto flatbuffers)
onnxruntime_add_include_to_target(onnxruntime_graph onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} flatbuffers)
+
+if (MSVC)
+ set(ONNX_PROTOBUF_NATVIS_FILE "onnx_protobuf.natvis")
+ target_sources(
+ onnxruntime_graph
+ INTERFACE $
+ )
+endif()
+
if(NOT MSVC)
target_compile_options(onnxruntime_graph PRIVATE "-Wno-parentheses")
endif()