Visual Studio C#からOfficeを使用する方法は?
-
03-07-2019 - |
質問
Visual StudioでOfficeのCOM相互運用機能への参照を追加する方法は、次の場所に移動することです。
- 参照
- 参照を追加
- [ COM ]タブを選択します
- Microsoft Office 11.0オブジェクトライブラリを選択
そして魔法のような名前のリファレンスが表示されます:
Microsoft.Office.Core
Project.csproj
ファイルには、参照の詳細が表示されます。
<COMReference Include="Microsoft.Office.Core">
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>3</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
そして、プロジェクトはソース管理にチェックインされ、すべてが順調です。
次に、 Office 2007 を使用する開発者は、ソース管理からプロジェクトを取得します。そのような参照が存在しないため、ビルドできません。
彼(つまり私)は.csprojファイルをチェックアウトし、への参照を削除します
Microsoft Office 11.0 Object Library
COM参照を次のように再度追加します
Microsoft Office 12.0 Object Library
そして魔法のように名前付き参照が表示されます:
<COMReference Include="Microsoft.Office.Core">
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>4</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
Project.csproj
ファイルには、参照の詳細が表示されます。
<COMReference Include="Microsoft.Office.Core">
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>3</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
そして、プロジェクトはソース管理にチェックインされ、すべてが順調です。
その後、 Office 2003 を使用する開発者は、ソース管理からプロジェクトを取得します。そのような参照が存在しないため、ビルドできません。
彼(つまり私ではない)は.csprojファイルをチェックアウトし、参照を削除します
"Excel.Application"
COM参照を次のように再度追加します
{00024500-0000-0000-C000-000000000046}
そして魔法のように名前付き参照が表示されます:
public IUnknown CreateOleObject(string className)
{
IUnknown unk;
Clsid classID = ProgIDToClassID(className);
CoCreateInstance(classID, null,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IUnknown, out unk);
return unk;
}
Project.csproj
ファイルには、参照の詳細が表示されます。
[ComImport]
[Guid("00024500-0000-0000-C000-000000000046")]
public class Excel
{
}
そして、プロジェクトはソース管理にチェックインされ、すべてが順調です。
その後、プロジェクトがビルドされ、 CD に押し付けられ、 Office 2007 を持っている顧客に送信されます。
そしてすべてがうまくいっていません。
昔(つまり、.NET dll hellの前)、バージョンに依存しないProgID を使用してOfficeオブジェクトを参照していました。つまり、
<*>インストールされたOfficeの clsid に解決されます。例:
<*>そのクラスは、COMへの呼び出しを使用して構築されます(言語ネット疑似コード):
<*>質問
1)インストールされたOfficeアプリケーションを自動化するために承認された手法は何ですか?
3)Office 2003プライマリ相互運用機能アセンブリを使用する場合、office 2003をインストールする必要がありますか?
4)Office 2003プライマリ相互運用機能アセンブリを使用してビルドした場合、顧客は永久にOffice 20003に関連付けられますか?
5) Office 2007 プライマリ相互運用機能アセンブリ?
6)Office 2007プライマリ相互運用機能アセンブリをインストールする場合、Office 2007をインストールする必要がありますか?
7)標準のCOM相互運用機能を使用してExcel、Word、またはOutlookを駆動することの何が問題になっていますか?例:
<*>8)を追加すると何が達成されますか
- COMタブのアイテムへの参照、
- [ComImport]を使用するのではなく、
- Office 2007プライマリ相互運用機能アセンブリを使用するのではなく?
9) COM相互運用を使用するのと同じですが、 COMタブを使用して参照を追加します。ただし、タイプライブラリ見えますか?
10)Office 2003プライマリ相互運用機能アセンブリには、以下との後方および前方互換性がありますか? -オフィス14 -Office 2007 -Office 2003 -Office XP -オフィス2000 -オフィス97 -Office 95
顧客と開発者が新しいバージョンのOfficeをインストールした場合でも、それは機能しますか?
11)私たちは持っていますか
解決 2
答えは、「ローカルコピー」です。相互運用のために取得するアセンブリDLL。出力フォルダーにアセンブリdllを作成したら、参照を追加し、ソース管理にチェックインします。
これで、参照されたアセンブリdllが全員になりました。
他のヒント
うわー、それは膨大な数の質問です。一般に、アプリがPIAを使用している場合、対象ユーザーには何らかのバージョンのOfficeがインストールされていると想定していると思います。 PIAは、ターゲットユーザーがOfficeをインストールするときにGACにインストールされます。 Officeがインストールされていない場合、なぜOfficeをターゲットにしているのですか?
はい、Office dllはOfficeを自動化する正しい方法です。 こちらのアセンブリのリストがあります。一部はOffice 2007用です。
VSTO(オフィス用のVisual Studioツール)を使用していますか?
古いスレッドで、おそらくほとんどの人はCopyLocal = Trueに満足しているでしょうが、別の方法があります。 プロジェクトファイルで both (またはそれ以上..?Office 2010を考えます)参照を使用し、無視するか、MSBuildに&quot; MSB3284&quot;を無視するよう指示します。警告(ライブラリが見つかりません)。 したがって、これを.csprojファイルに含めます。
<COMReference Include="Microsoft.Office.Core">
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>3</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
フォロー::
<COMReference Include="Microsoft.Office.Core">
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>4</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
MicrosoftがこのためにNuGetライブラリを提供しているかどうかを確認したいと思います-誰もが同じアプローチをとれるようにするためです。そうすれば、人々がこれらの答えをウェブで検索する必要がなくなると思います...これはMicrosoft Officeのライセンスに反するので、それを提供するのは彼らだけだと思います。
ローカルコピーを使用した場合、これらのライブラリを誤って再配布しないように注意する必要があります。