おはようは、開発者がフェロー:私の共有アドインコンストラクタで何が問題になっていますか?
私は現在、いくつかのパフォーマンスの問題を解決しようとしているエクセル共有アドイン以前の開発者から継承され、基本的に私は、アドインのものが内部どのように機能するかを見つけようとしていますExcelで、私は情報のためのネットを検索していた意味、私の理解では、次のとおりです。LoadBehaviourがオープンイベント中にExcelワークブック3
- 以前に参照されているすべてのアドインをロードする必要がありますVBAプロジェクトで
- ドキュメントが開いている私のアドインは、VBAコードで使用できるようにする必要があります。
このようにグローバル変数
Public myAddin As Object
Set myAddin = New TradingAddin.TradingAddin
がある今、私は、アドインにlog4netのを追加して、不思議に十分な私は、Excelワークブックで開くイベント中に、次の行動
を見ていましたC#クラスのコンストラクタが呼び出されます。
コンストラクタがもう1回呼び出され、すべてのIDTExtensibility2メソッドOnConnection、OnDisconnectionなどが期待通りに呼び出されます。
私はExcelがロードされたら、アドイン、それはVBEコードに利用可能であるべきと私は
Set myAddin = Application.COMAddins.Item("Trading").Object
のようなものを書くことができると思った。しかし、それは何もないとクラスのコンストラクタを呼び出すことが二度すべての状態を破棄返しますExcelワークブックの使用中にメモリ内で使用できるはずのC#オブジェクト内に保存されます。
更新:
プラットフォームは、Visual Studio 2005チームエディションとターゲット・アプリケーションは、Excel 2003ので、アドインが共有アドインです。私はVSTOを使用していません。
私はVBAで起動しようとしていた実際のコードが
Set addIn = Application.COMAddIns.Item("K2Trading.K2Trading").Connect
Set managedObject3 = addIn.Object <--- This value that I thought was an Instance of the Add-in is equal to Nothing (NULL)
Set addIn = Application.COMAddIns("K2Trading.K2Trading").Connect
また2つの負荷アドインを正しくすべての拡張イベントOnConnectionに焼成初めてから3にレジストリにLoadBehaviourを変更され、OnDisconecctionとObject Class Constructor、Add-inのインスタンスをVBAの参照に接続し、そこからInterfaceを介して公開されるすべてのメソッドを呼び出す方法を意味する、Add-inのVBAから呼び出し部のための方法を見つける必要がありますCOMオブジェクト????
また、ProcMonを使用して、このリンク(非常に便利)のアドインが見つかって読み込まれたことを再度確認しました。http://blogs.msdn.com/dvespa/archive/2008/10/15/troubleshooting-outlook-com-addins-using-procmon.aspx
私たちはおそらく正しい方向を指していますか?
COMオブジェクトのインスタンス数は、どのようにして読み込まれますか?または別の言葉に入れて、COMオブジェクトの単一のインスタンスを持つことは可能でしょうか?
TIA、 ペドロ
マイクへ:
私はあなたのソリューションを試みたが、I'vは(HRESULTからの例外:0x80004005の(E_FAIL))予期しないエラーに直面して、このコード
を実行するときpublic void OnConnection(object application, Extensibility.ext_ConnectMode connectMode,
object addInInst, ref System.Array custom)
{
object missing = System.Reflection.Missing.Value;
try
{
if (debug)
{
log.Debug("Connection Mode :" + connectMode);
}
this.excelApp = (Excel.Application)application;
this.addInInstance = addInInst;
Office.COMAddIn addIn = this.excelApp.COMAddIns.Item(ref addInInst);
//addIn.Object = this;
// We connect our Instance of the Add-in to the Arrya of COMAddins of Excel
VBA.Interaction.CallByName(addIn, "Object", VBA.CallType.Let, this);
^
|
The Exception occurs here.
あなたと少し違って見えることに気づくでしょう。少し前に投稿しました
public void OnConnection(
object application,
Extensibility.ext_ConnectMode connectMode,
object addInInst,
ref System.Array custom)
{
// Direct call fails b/c ".Object" is a late-bound call:
//
// addInInst.Object = this;
// Reflection fails I believe b/c .Object is a 'let' assigned
// property for reference type, which is very unusual even for
// COM (although legal) and is a foreign concept to .NET. Use
// of the right BindingFlags here *might* work, but I'm not sure:
//
// PropertyInfo propInfo;
// propInfo = addInInst.GetType().GetProperty("Object");
// propInfo.SetValue(addInInst, this, null);
// This works!:
VBA.Interaction.CallByName(addInInst, "Object", VBA.CallType.Let, this);
}
addInInstはOffice.COMAddinが、私のクラスのインスタンスとして渡されていないので、それはそのクラスに存在していないので、そう は、オブジェクトのプロパティに代入しようとすることは間違ってい
また、私は好奇心が強いですExcelがアドインをロードする方法については、Excelをロードした直後の私の所見に基づいていますが、OnConnectionメソッドはすぐに実行されませんでしたが、= AvgCost()関数がヒットするまでは??
アイデア?
、これはペドロに役立ちます願っていますか?あなたは何を求めているのですか? – shahkalpesh