5

Visual Studio 2005で開発されたアプリケーションがあり、ClickOnceを使用して展開しています。私のソリューションには、VBでコード化されたユーザーインターフェイスレイヤーとC#でコード化されたクラスライブラリの2つのプロジェクトが含まれています。私のC#クラスライブラリには、OutlookとExcelの相互運用機能アセンブリ(Microsoft.Office.Interop.OutlookとMicrosoft.Office.Interop.Excel、両方ともバージョン11)を使用するコードがいくつかあります。これが私の質問です。

  1. これが絶対的なものとして記載されている場所はわかりませんが、相互運用機能アセンブリを使用するアプリケーションをインストールするには、適切なバージョンのOfficeアプリケーション(Outlook / Excel)が必要であると理解しています。これは正しいです?

If(1. = Yes)Then

アプリケーションが相互運用機能アセンブリを使用して、ユーザーベース全体の一部のみが使用するいくつかの機能のみを使用する状況にどのように対処しますか?一部のユーザーのみがこれらの機能を使用する必要があるのに、アプリケーションのすべてのユーザーにMicrosoft Officeのインストールを要求する必要があるのはなぜですか?これらの相互運用機能アセンブリは単なる.dllファイルですが、プロジェクトでファイルを公開するだけで、クライアントにインストールされているソフトウェアに関係なく参照を満たすことができないという点で、他のアセンブリと大きく異なる点は何ですか?(明らかに、GACと、それがVisual Studioの動作に与える影響についての理解が不十分です。)独自のコードを記述して、それらを使用するいくつかの機能に必要なOfficeソフトウェアの存在を確認できれば幸いです。Officeなし、機能へのアクセスなし...

そうしないと

これについての私の理解が正しくない場合、ユーザーがインストールの試行時に次のエラーに遭遇しないように、参照とClickOnce設定をセットアップするにはどうすればよいですか?

「アプリケーションをインストールまたは実行できません。アプリケーションでは、最初にアセンブリオフィスバージョン11.0.0.0をグローバルアセンブリキャッシュ(GAC)にインストールする必要があります。

システム管理者に連絡してください。」

  • 相互運用機能の参照CopyLocalプロパティをTrueとFalseの両方に設定してみました。
  • ClickOnceアプリケーションファイルリストで、これらのアセンブリを包含、除外、および前提条件に設定してみました。
  • 私の調査では、これらの参照が* C:\ WINDOWS \ assembly \ GAC *を指している場合、私の場合は* C:\ Program Files \ Microsoft Visual Studio 9.0 \ Visual Studio Tools for Office \ PIA \Office11*を指している場合があります。しかし、参照パスを変更する方法が見つかりませんでした。http://msdn.microsoft.com/en-us/library/ez524kew(VS.80).aspxによると、GACからの参照を追加することはできませんが、他の人はどのように管理しましたか?
  • * C:\ Program Files \ Microsoft Visual Studio 9.0 \ Visual Studio Tools for Office \ PIA \ Office11 *からプロジェクトディレクトリに参照をコピーして、そこで参照してみました。

終了する場合

私が知る必要がある主なことは、これらのアセンブリを出版物に含めて、GAC要件を満たすかバイパスする方法/かどうかだと思います。

可能であれば、私の特定の質問にできるだけ直接答えるようにしてください。記事は役に立ちますが、私はすでにたくさんの記事を読み、たくさんの提案された解決策を試しましたが、成功しませんでした。そもそも、これがどのように機能するかについてのロジスティクスについての私の理解の欠如を覚えておいてください。

私の理解不足を許してください、そしてあなたが提供できるどんな助けにも感謝します。よろしくお願いします!

4

5 に答える 5

8

NetOffice プロジェクト ( http://netoffice.codeplex.com/ ) を参照してください。

これは、バージョンに依存しない相互運用機能アセンブリの無料 (MIT ライセンス) で完全な (2000 ~ 2010 のすべてのバージョンとすべての Office アプリ) セットです。アセンブリは、ツールを使用して実際の PIA から生成されるため、正しく、完全で最新のものであり、将来のバージョン用に迅速に更新される可能性があります。

もう 1 つの優れた機能は、各メンバーの IntelliSense が、そのメンバーを実装している Office バージョンを表示することです。

展開のために、アプリでアセンブリをコピーまたはインストールできます。

于 2011-07-11T18:50:49.727 に答える
2

私の経験では、広範な展開シナリオで Office 相互運用機能アセンブリを管理しようとするのは悪夢です。ClickOnce を介して展開している場合、上記の GAC 問題を回避したとしても (これが企業環境の場合、おそらく IT 部門に相互運用アセンブリの GAC 登録をプッシュさせることによって)、次のような状況に対処する必要があります。ユーザーは、標準とは異なるバージョンの Office を使用しています。Office 13 が出て、ユーザーがアップグレードを開始し、アプリケーションが壊れた場合、天国が助けてくれます。

バージョンに関連付けられた相互運用アセンブリを使用して回避するために、pinvoke を使用して、バージョンに依存しない Office COM ラッパーに直接 Office オートメーションを実行できます (レジストリからクライアントの現在の Office バージョンを取得します)。ただし、これには独自の展開上の課題があり (たとえば、PIA がインストールされているマシンを処理するためにレジストリを更新する必要がある場合があります。これは、展開に ClickOnce を使用する場合に非常に困難になる可能性があります)。

もし私があなたの立場だったとしたら、まず、あなたがクラス ライブラリで使用している相互運用機能を詳しく調べることから始めます。必要な機能を提供する別の方法はありますか? クライアント マシン上のオフィス相互運用機能以外に必要な機能はありますか? おそらく、クライアントがサーバーに要求を送信して、カスタマイズされたオフィス ドキュメントを生成し、ダウンロードできるようにするサービス指向のソリューションです。

于 2009-08-06T15:51:18.517 に答える
1

最良の方法は、遅延バインディングライブラリを使用することです

https://sourceforge.net/projects/exceldata/

  • 異なるオフィスバージョンのiteropsとtlbsを使用した悪夢はありません
  • さまざまなオフィスのサポート
  • 簡単に変更できます

でも:

  • このライブラリをサポートするのは難しい
于 2010-04-07T18:34:46.040 に答える
1

これが私が経験から知っていることです (ClickOnce を使用しなかったことを指摘しておく必要がありますが、それが重要な理由はわかりません)。

Excel 2003 API に書き込み、Excel 2007 を搭載したマシンに展開すると、Excel 2007 は基本的に Excel 2003 を偽装するため、機能します。問題は、一部の API が変更され、一部は削除されていることです。アプリケーションが影響を受けるかどうかを確認するには、自分で試してみる必要があります。

実際には、それよりも少し悪いです。Excel 2003 と Excel 2007 がインストールされているマシンでアプリケーションを実行する場合、Interop を使用しても Excel 2007 が使用されます。

1 つの可能性は、SpreadsheetGear for .NETを使用することです。これにより、アプリケーションと共に展開できる 1 つの .NET アセンブリに完全に実装された Excel 互換の Windows フォーム コントロールが提供されるため、アプリケーションは Office に依存しません。

試してみたい場合は、こちらから無料の試用版をダウンロードできます。

免責事項: 私は SpreadsheetGear LLC を所有しています

于 2009-08-06T16:35:07.337 に答える
0

COM インターフェイスと遅延バインディングを使用します。VB.NET は常に遅延バインディングをサポートしています。Marshal.GetActiveObject() を使用して、変数の型を Object に設定するだけです。これを行う VB.NET オブジェクトを作成し、C# から呼び出すことができます。

C# では、リフレクション API を使用すると遅延バインディングが発生しますが、これを使用してコードを記述するのはかなり面倒です。C# 4 では、動的型を介して遅延バインディングを取得することもできます。

これを行う場合、Office アセンブリを配布する必要はなく、Office API のオブジェクトの属性が変更されない限り、コードは機能します。

レイト バインディング コードはアーリー バインディング コードよりも低速ですが、多くの場合、これは問題になりません。

于 2011-07-11T18:15:48.427 に答える