Skip to content

Commit 7f4702a

Browse files
authoredFeb 8, 2024
Remove built-in COM interop support from Mono runtime (#97789)
1 parent ac14935 commit 7f4702a

32 files changed

+171
-5190
lines changed
 

‎src/mono/CMakeLists.txt

-2
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ if(ENABLE_MINIMAL)
8484
process_enable_minimal()
8585
endif()
8686

87-
set(DISABLE_COM 1)
88-
8987
# Dependencies between options
9088
if(ENABLE_INTERP_LIB)
9189
set(DISABLE_INTERPRETER 1)

‎src/mono/System.Private.CoreLib/src/System/RuntimeTypeHandle.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,6 @@ internal static bool HasElementType(RuntimeType type)
205205
[MethodImplAttribute(MethodImplOptions.InternalCall)]
206206
internal static extern bool HasInstantiation(QCallTypeHandle type);
207207

208-
[MethodImplAttribute(MethodImplOptions.InternalCall)]
209-
internal static extern bool IsComObject(QCallTypeHandle type);
210-
211208
[MethodImplAttribute(MethodImplOptions.InternalCall)]
212209
internal static extern bool IsInstanceOfType(QCallTypeHandle type, [NotNullWhen(true)] object? o);
213210

@@ -234,10 +231,13 @@ internal static bool HasInstantiation(RuntimeType type)
234231
return HasInstantiation(new QCallTypeHandle(ref type));
235232
}
236233

234+
#pragma warning disable IDE0060
237235
internal static bool IsComObject(RuntimeType type, bool isGenericCOM)
238236
{
239-
return isGenericCOM ? false : IsComObject(new QCallTypeHandle(ref type));
237+
// Mono runtime doesn't support built-in COM.
238+
return false;
240239
}
240+
#pragma warning restore IDE0060
241241

242242
#pragma warning disable IDE0060
243243
internal static bool IsEquivalentTo(RuntimeType rtType1, RuntimeType rtType2)

‎src/mono/cmake/config.h.in

-3
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,6 @@
235235
/* Disable support debug logging */
236236
#cmakedefine DISABLE_LOGGING 1
237237

238-
/* Disable COM support */
239-
#cmakedefine DISABLE_COM 1
240-
241238
/* Disable advanced SSA JIT optimizations */
242239
#cmakedefine DISABLE_SSA 1
243240

‎src/mono/cmake/options.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ option (DISABLE_AOT "Disable AOT Compiler")
66
option (DISABLE_DEBUG "Disable runtime debugging support")
77
option (DISABLE_REFLECTION_EMIT "Disable reflection emit support")
88
option (DISABLE_LOGGING "Disable support debug logging")
9-
option (DISABLE_COM "Disable COM support")
109
option (DISABLE_SSA "Disable advanced SSA JIT optimizations")
1110
option (DISABLE_JIT "Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.")
1211
option (DISABLE_INTERPRETER "Disable the interpreter.")

‎src/mono/mono/component/marshal-ilgen.c

-128
Original file line numberDiff line numberDiff line change
@@ -414,15 +414,6 @@ emit_marshal_array_ilgen (EmitMarshalContext *m, int argnum, MonoType *t,
414414
switch (spec->native) {
415415
case MONO_NATIVE_LPARRAY:
416416
break;
417-
case MONO_NATIVE_SAFEARRAY:
418-
#ifndef DISABLE_COM
419-
if (spec->data.safearray_data.elem_type != MONO_VARIANT_VARIANT) {
420-
char *msg = g_strdup ("Only SAFEARRAY(VARIANT) marshalling to managed code is implemented.");
421-
cb_to_mono->methodBuilder.emit_exception_marshal_directive (mb, msg);
422-
return conv_arg;
423-
}
424-
return mono_cominterop_emit_marshal_safearray (m, argnum, t, spec, conv_arg, conv_arg_type, action);
425-
#endif
426417
default: {
427418
char *msg = g_strdup ("Unsupported array type marshalling to managed code.");
428419
cb_to_mono->methodBuilder.emit_exception_marshal_directive (mb, msg);
@@ -2618,108 +2609,6 @@ emit_marshal_object_ilgen (EmitMarshalContext *m, int argnum, MonoType *t,
26182609
return conv_arg;
26192610
}
26202611

2621-
static int
2622-
emit_marshal_variant_ilgen (EmitMarshalContext *m, int argnum, MonoType *t,
2623-
MonoMarshalSpec *spec,
2624-
int conv_arg, MonoType **conv_arg_type,
2625-
MarshalAction action)
2626-
{
2627-
#ifndef DISABLE_COM
2628-
MonoMethodBuilder *mb = m->mb;
2629-
MonoType *variant_type = m_class_get_byval_arg (mono_class_get_variant_class ());
2630-
MonoType *variant_type_byref = mono_class_get_byref_type (mono_class_get_variant_class ());
2631-
MonoType *object_type = cb_to_mono->get_object_type ();
2632-
2633-
switch (action) {
2634-
case MARSHAL_ACTION_CONV_IN: {
2635-
conv_arg = cb_to_mono->methodBuilder.add_local (mb, variant_type);
2636-
2637-
if (m_type_is_byref (t))
2638-
*conv_arg_type = variant_type_byref;
2639-
else
2640-
*conv_arg_type = variant_type;
2641-
2642-
if (m_type_is_byref (t) && !(t->attrs & PARAM_ATTRIBUTE_IN) && t->attrs & PARAM_ATTRIBUTE_OUT)
2643-
break;
2644-
2645-
cb_to_mono->methodBuilder.emit_ldarg (mb, argnum);
2646-
if (m_type_is_byref (t))
2647-
cb_to_mono->methodBuilder.emit_byte(mb, CEE_LDIND_REF);
2648-
cb_to_mono->methodBuilder.emit_ldloc_addr (mb, conv_arg);
2649-
cb_to_mono->methodBuilder.emit_managed_call (mb, mono_get_Marshal_GetNativeVariantForObject (), NULL);
2650-
break;
2651-
}
2652-
2653-
case MARSHAL_ACTION_CONV_OUT: {
2654-
if (m_type_is_byref (t) && (t->attrs & PARAM_ATTRIBUTE_OUT || !(t->attrs & PARAM_ATTRIBUTE_IN))) {
2655-
cb_to_mono->methodBuilder.emit_ldarg (mb, argnum);
2656-
cb_to_mono->methodBuilder.emit_ldloc_addr (mb, conv_arg);
2657-
cb_to_mono->methodBuilder.emit_managed_call (mb, mono_get_Marshal_GetObjectForNativeVariant (), NULL);
2658-
cb_to_mono->methodBuilder.emit_byte (mb, CEE_STIND_REF);
2659-
}
2660-
2661-
cb_to_mono->methodBuilder.emit_ldloc_addr (mb, conv_arg);
2662-
cb_to_mono->methodBuilder.emit_managed_call (mb, mono_get_Variant_Clear (), NULL);
2663-
break;
2664-
}
2665-
2666-
case MARSHAL_ACTION_PUSH:
2667-
if (m_type_is_byref (t))
2668-
cb_to_mono->methodBuilder.emit_ldloc_addr (mb, conv_arg);
2669-
else
2670-
cb_to_mono->methodBuilder.emit_ldloc (mb, conv_arg);
2671-
break;
2672-
2673-
case MARSHAL_ACTION_CONV_RESULT: {
2674-
char *msg = g_strdup ("Marshalling of VARIANT not supported as a return type.");
2675-
cb_to_mono->methodBuilder.emit_exception_marshal_directive (mb, msg);
2676-
break;
2677-
}
2678-
2679-
case MARSHAL_ACTION_MANAGED_CONV_IN: {
2680-
conv_arg = cb_to_mono->methodBuilder.add_local (mb, object_type);
2681-
2682-
if (m_type_is_byref (t))
2683-
*conv_arg_type = variant_type_byref;
2684-
else
2685-
*conv_arg_type = variant_type;
2686-
2687-
if (m_type_is_byref (t) && !(t->attrs & PARAM_ATTRIBUTE_IN) && t->attrs & PARAM_ATTRIBUTE_OUT)
2688-
break;
2689-
2690-
if (m_type_is_byref (t))
2691-
cb_to_mono->methodBuilder.emit_ldarg (mb, argnum);
2692-
else
2693-
cb_to_mono->methodBuilder.emit_ldarg_addr (mb, argnum);
2694-
cb_to_mono->methodBuilder.emit_managed_call (mb, mono_get_Marshal_GetObjectForNativeVariant (), NULL);
2695-
cb_to_mono->methodBuilder.emit_stloc (mb, conv_arg);
2696-
break;
2697-
}
2698-
2699-
case MARSHAL_ACTION_MANAGED_CONV_OUT: {
2700-
if (m_type_is_byref (t) && (t->attrs & PARAM_ATTRIBUTE_OUT || !(t->attrs & PARAM_ATTRIBUTE_IN))) {
2701-
cb_to_mono->methodBuilder.emit_ldloc (mb, conv_arg);
2702-
cb_to_mono->methodBuilder.emit_ldarg (mb, argnum);
2703-
cb_to_mono->methodBuilder.emit_managed_call (mb, mono_get_Marshal_GetNativeVariantForObject (), NULL);
2704-
}
2705-
break;
2706-
}
2707-
2708-
case MARSHAL_ACTION_MANAGED_CONV_RESULT: {
2709-
char *msg = g_strdup ("Marshalling of VARIANT not supported as a return type.");
2710-
cb_to_mono->methodBuilder.emit_exception_marshal_directive (mb, msg);
2711-
break;
2712-
}
2713-
2714-
default:
2715-
g_assert_not_reached ();
2716-
}
2717-
#endif /* DISABLE_COM */
2718-
2719-
return conv_arg;
2720-
}
2721-
2722-
27232612
static int
27242613
emit_marshal_ilgen (EmitMarshalContext *m, int argnum, MonoType *t,
27252614
MonoMarshalSpec *spec, int conv_arg,
@@ -2741,23 +2630,6 @@ emit_marshal_ilgen (EmitMarshalContext *m, int argnum, MonoType *t,
27412630
return emit_marshal_string_ilgen (m, argnum, t, spec, conv_arg, conv_arg_type, action);
27422631
case MONO_TYPE_CLASS:
27432632
case MONO_TYPE_OBJECT:
2744-
#if !defined(DISABLE_COM)
2745-
if (spec && spec->native == MONO_NATIVE_STRUCT)
2746-
return emit_marshal_variant_ilgen (m, argnum, t, spec, conv_arg, conv_arg_type, action);
2747-
#endif
2748-
2749-
#if !defined(DISABLE_COM)
2750-
if ((spec && (spec->native == MONO_NATIVE_IUNKNOWN ||
2751-
spec->native == MONO_NATIVE_IDISPATCH ||
2752-
spec->native == MONO_NATIVE_INTERFACE)) ||
2753-
(t->type == MONO_TYPE_CLASS && mono_cominterop_is_interface(t->data.klass)))
2754-
return mono_cominterop_emit_marshal_com_interface (m, argnum, t, spec, conv_arg, conv_arg_type, action);
2755-
if (spec && (spec->native == MONO_NATIVE_SAFEARRAY) &&
2756-
(spec->data.safearray_data.elem_type == MONO_VARIANT_VARIANT) &&
2757-
((action == MARSHAL_ACTION_CONV_OUT) || (action == MARSHAL_ACTION_CONV_IN) || (action == MARSHAL_ACTION_PUSH)))
2758-
return mono_cominterop_emit_marshal_safearray (m, argnum, t, spec, conv_arg, conv_arg_type, action);
2759-
#endif
2760-
27612633
if (cb_to_mono->try_get_safehandle_class () != NULL && t->data.klass &&
27622634
cb_to_mono->is_subclass_of_internal (t->data.klass, cb_to_mono->try_get_safehandle_class (), FALSE))
27632635
return emit_marshal_safehandle_ilgen (m, argnum, t, spec, conv_arg, conv_arg_type, action);

‎src/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ typedef struct _AssemblyEventData AssemblyEventData;
187187
typedef enum {
188188
TYPE_FLAGS_DELEGATE = 0x1,
189189
TYPE_FLAGS_FINALIZABLE = 0x2,
190-
TYPE_FLAGS_EXTERNALLY_IMPLEMENTED_COM_OBJECT = 0x4,
190+
// unused = 0x4,
191191
TYPE_FLAGS_ARRAY = 0x8,
192192

193193
TYPE_FLAGS_ARRAY_RANK_MASK = 0x3F00,
@@ -1547,8 +1547,6 @@ bulk_type_log_single_type (
15471547
val->fixed_sized_data.flags |= TYPE_FLAGS_FINALIZABLE;
15481548
if (m_class_is_delegate (klass))
15491549
val->fixed_sized_data.flags |= TYPE_FLAGS_DELEGATE;
1550-
if (mono_class_is_com_object (klass))
1551-
val->fixed_sized_data.flags |= TYPE_FLAGS_EXTERNALLY_IMPLEMENTED_COM_OBJECT;
15521550
val->fixed_sized_data.cor_element_type = (uint8_t)mono_underlying_type->type;
15531551

15541552
// Sets val variable sized parameter type data, type_parameters_count, and mono_type_parameters associated

‎src/mono/mono/metadata/CMakeLists.txt

-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ set(metadata_common_sources
6161
class-private-definition.h
6262
class-accessors.c
6363
class-setup-vtable.c
64-
cominterop.c
65-
cominterop.h
6664
components.h
6765
components.c
6866
debug-helpers.c

‎src/mono/mono/metadata/class-accessors.c

-10
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,6 @@ mono_class_set_declsec_flags (MonoClass *klass, guint32 value)
437437
mono_property_bag_add (m_class_get_infrequent_data (klass), prop);
438438
}
439439

440-
void
441-
mono_class_set_is_com_object (MonoClass *klass)
442-
{
443-
#ifndef DISABLE_COM
444-
mono_loader_lock ();
445-
klass->is_com_object = 1;
446-
mono_loader_unlock ();
447-
#endif
448-
}
449-
450440
void
451441
mono_class_set_is_simd_type (MonoClass *klass, gboolean is_simd)
452442
{

‎src/mono/mono/metadata/class-getters.h

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ MONO_CLASS_GETTER(m_class_has_cctor, gboolean, , MonoClass, has_cctor)
4141
MONO_CLASS_GETTER(m_class_has_references, gboolean, , MonoClass, has_references)
4242
MONO_CLASS_GETTER(m_class_has_static_refs, gboolean, , MonoClass, has_static_refs)
4343
MONO_CLASS_GETTER(m_class_has_no_special_static_fields, gboolean, , MonoClass, no_special_static_fields)
44-
MONO_CLASS_GETTER(m_class_is_com_object, gboolean, , MonoClass, is_com_object)
4544
MONO_CLASS_GETTER(m_class_is_nested_classes_inited, gboolean, , MonoClass, nested_classes_inited)
4645
MONO_CLASS_GETTER(m_class_get_class_kind, guint8, , MonoClass, class_kind)
4746
MONO_CLASS_GETTER(m_class_is_interfaces_inited, gboolean, , MonoClass, interfaces_inited)

‎src/mono/mono/metadata/class-init.c

-30
Original file line numberDiff line numberDiff line change
@@ -3188,20 +3188,6 @@ mono_class_init_checked (MonoClass *klass, MonoError *error)
31883188
return success;
31893189
}
31903190

3191-
#ifndef DISABLE_COM
3192-
/*
3193-
* COM initialization is delayed until needed.
3194-
* However when a [ComImport] attribute is present on a type it will trigger
3195-
* the initialization. This is not a problem unless the BCL being executed
3196-
* lacks the types that COM depends on (e.g. Variant on Silverlight).
3197-
*/
3198-
static void
3199-
init_com_from_comimport (MonoClass *klass)
3200-
{
3201-
/* FIXME : we should add an extra checks to ensure COM can be initialized properly before continuing */
3202-
}
3203-
#endif /*DISABLE_COM*/
3204-
32053191
/*
32063192
* LOCKING: this assumes the loader lock is held
32073193
*/
@@ -3226,14 +3212,6 @@ mono_class_setup_parent (MonoClass *klass, MonoClass *parent)
32263212
}
32273213

32283214
if (!MONO_CLASS_IS_INTERFACE_INTERNAL (klass)) {
3229-
/* Imported COM Objects always derive from __ComObject. */
3230-
#ifndef DISABLE_COM
3231-
if (MONO_CLASS_IS_IMPORT (klass)) {
3232-
init_com_from_comimport (klass);
3233-
if (parent == mono_defaults.object_class)
3234-
parent = mono_class_get_com_object_class ();
3235-
}
3236-
#endif
32373215
if (!parent) {
32383216
/* set the parent to something useful and safe, but mark the type as broken */
32393217
parent = mono_defaults.object_class;
@@ -3254,9 +3232,6 @@ mono_class_setup_parent (MonoClass *klass, MonoClass *parent)
32543232

32553233
klass->delegate = parent->delegate;
32563234

3257-
if (MONO_CLASS_IS_IMPORT (klass) || mono_class_is_com_object (parent))
3258-
mono_class_set_is_com_object (klass);
3259-
32603235
if (system_namespace) {
32613236
if (klass->name [0] == 'D' && !strcmp (klass->name, "Delegate"))
32623237
klass->delegate = 1;
@@ -3270,11 +3245,6 @@ mono_class_setup_parent (MonoClass *klass, MonoClass *parent)
32703245
}
32713246
/*klass->enumtype = klass->parent->enumtype; */
32723247
} else {
3273-
/* initialize com types if COM interfaces are present */
3274-
#ifndef DISABLE_COM
3275-
if (MONO_CLASS_IS_IMPORT (klass))
3276-
init_com_from_comimport (klass);
3277-
#endif
32783248
klass->parent = NULL;
32793249
}
32803250

‎src/mono/mono/metadata/class-internals.h

-20
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,6 @@ int mono_class_interface_match (const uint8_t *bitmap, int id);
331331

332332
#define MONO_VTABLE_AVAILABLE_GC_BITS 4
333333

334-
#ifdef DISABLE_COM
335-
#define mono_class_is_com_object(klass) (FALSE)
336-
#else
337-
#define mono_class_is_com_object(klass) (m_class_is_com_object (klass))
338-
#endif
339-
340-
341334
MONO_API int mono_class_interface_offset (MonoClass *klass, MonoClass *itf);
342335
MONO_COMPONENT_API int mono_class_interface_offset_with_variance (MonoClass *klass, MonoClass *itf, gboolean *non_exact_match);
343336

@@ -979,16 +972,6 @@ mono_class_try_get_##shortname##_class (void) \
979972

980973
GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL (safehandle)
981974

982-
#ifndef DISABLE_COM
983-
984-
GENERATE_GET_CLASS_WITH_CACHE_DECL (interop_proxy)
985-
GENERATE_GET_CLASS_WITH_CACHE_DECL (idispatch)
986-
GENERATE_GET_CLASS_WITH_CACHE_DECL (iunknown)
987-
GENERATE_GET_CLASS_WITH_CACHE_DECL (com_object)
988-
GENERATE_GET_CLASS_WITH_CACHE_DECL (variant)
989-
990-
#endif
991-
992975
MonoClass* mono_class_get_appdomain_class (void);
993976

994977
GENERATE_GET_CLASS_WITH_CACHE_DECL (appdomain_unloaded_exception)
@@ -1370,9 +1353,6 @@ mono_class_get_declsec_flags (MonoClass *klass);
13701353
void
13711354
mono_class_set_declsec_flags (MonoClass *klass, guint32 value);
13721355

1373-
void
1374-
mono_class_set_is_com_object (MonoClass *klass);
1375-
13761356
void
13771357
mono_class_set_weak_bitmap (MonoClass *klass, int nbits, gsize *bits);
13781358

‎src/mono/mono/metadata/class-private-definition.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,7 @@ struct _MonoClass {
6666
guint has_ref_fields : 1; /* it has byref fields */
6767
guint has_static_refs : 1; /* it has static fields that are GC-tracked */
6868
guint no_special_static_fields : 1; /* has no thread/context static fields */
69-
/* directly or indirectly derives from ComImport attributed class.
70-
* this means we need to create a proxy for instances of this class
71-
* for COM Interop. set this flag on loading so all we need is a quick check
72-
* during object creation rather than having to traverse supertypes
73-
*/
74-
guint is_com_object : 1;
69+
7570
guint nested_classes_inited : 1; /* Whenever nested_class is initialized */
7671

7772
/* next byte*/

0 commit comments

Comments
 (0)
Please sign in to comment.