COMやその元アイデアのCORBAは、CやC++で使うことを
メインに考えられているようなものだからね。

Cだとオブジェクト指向ではないから、インスタンス作成できない。
また直接メモリにアクセスしたりするからマネージコードもGCもつけられない
というかそんなのを考えて設計していない。
オブジェクト指向のC++であっても、オブジェクト指向のDLLには共通形式が存在しない。
(クラスをエクスポートする標準的な方法が無い)

かといって言語拡張するわけにも行かず、旧技術でいろいろやる必要がある。
だからいろいろと取り決めが必要となってしまい、
IUnknownなどというものが特にC/C++において表面化してしまった。
好きに言語拡張が出来る非.NEのVBやDelphiなんかはCOMがはうまくラップされていたね。

.NETではGCを採用したオブジェクト指向言語から使うのをメインにして、
DLLもオブジェクト指向になっているから、うまくCOM相当の技術をラップすることが出来た。