質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

0回答

5562閲覧

__ComObject のアセンブリを取得する方法

lazex

総合スコア604

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2017/01/23 13:29

.net (VB または C#) で COM を扱うアプリケーションを作っています。

CreateObject で取得したオブジェクトのアセンブリを取得したいのですが、取得できるときとできない時があります。

[Module1.vb]

vb.net

1Imports System.Reflection 2 3Module Module1 4 5 Sub Main() 6 Dim excel As Object = CreateObject("Excel.Application") 7 Dim asm As Assembly = excel.GetType().Assembly 8 Console.WriteLine(asm) 9 Console.ReadLine() 10 End Sub 11 12End Module

C# では Type.GetTypeFromProgID で型取得しています。

ここでは Excel を使っていて PC には Office2013 が入っているので期待するのは

型が
Microsoft.Office.Interop.Excel
アセンブリが
[Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]
です。

64bit Office が入った PC ではアプリケーションが 32bit、 64bit 問わずに上記の値が取得できました。

しかし、32bit Office が入った PC では型が __ComObject となり、アセンブリは mscorlib になってしまいます。

32bit Office2013 が入ったPCは複数あったので試したところどれも同じ結果でした。
また、 32bit Office2016 にしても同じでした。
しかし、 32bit Office2010 ではどちらも正常に取得できていました。

Office2013 からは 64bit アプリから 32bit Office の正確な型情報がとれなくなったのでしょうか?
取得する方法があれば教えていただきたいです。

補足1
実行環境により Office バージョンは異なるため [Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]Type.GetType で指定することはできません。

補足2
__ComObject になるものは仕方ないとみなして __ComObject から正確な型およびアセンブリを取得しようとしてみましたが以下のとおりうまく行っていません。

  • AppDomain.CurrentDomain.GetAssembles() から探す

__ComObject 状態で扱えても Excel をアセンブリがロードされていないので見つからない。

  • ComTypes.ITypeInfo 化して Marshal.GetTypeForITypeInfo(Marshal.GetIUnknownForObject(typeInfo))

実用に耐えないレベル(数分)待たされる。
また、アセンブリが異なる ↓
[Excel, Version=1.8.0.0, Culture=neutral, PublicKeyToken=null]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問