0

既存の InstallScript プロジェクトを拡張していて、.NET 4.0 を対象とするアセンブリでメソッドを呼び出す必要があります。

プロジェクトは、同じアセンブリ内の別のクラスのメソッドを既に呼び出しています。

既存の .NET メソッド呼び出しで見たものをミラーリングすると、これまでのところ次のようになります。

//////////////////////////////////////////////////////////////////////////////
// SomeFunction
//
// Wraps SomeAssembly.SomeClass.SomeMethod.
//////////////////////////////////////////////////////////////////////////////
prototype number SomeFunction();
function number SomeFunction()
    string szDLL, szAssemblyandClassName;
    OBJECT oSomeClass;
    number nResult;
begin
    ChangeDirectory(SRCDIR); // changed from ChangeDirectory(SUPPORTDIR), which yielded error number -2147219705 in the try-catch below
    szDLL = "SomeAssembly.dll";
    szAssemblyAndClassName = "SomeAssembly.SomeClass";

    try
        SprintfBox(INFORMATION, "Debug", "Calling DotNetCoCreateObject(\"%s\", \"%s\", \"\")..."), szDLL, szAssemblyAndClassName); // FORNOW
        set oSomeClass = DotNetCoCreateObject(szDLL, szAssemblyAndClassName, "");
    catch
        SprintfBox(SEVERE, "Error", "Error %i:\n\n%s\n\n%s", Err.Number, Err.Description, Err.LastDllError);
        abort;
    endcatch;

    SprintfBox(INFORMATION, "Debug", "Calling oSomeClass.SomeMethod()..."); // FORNOW
    nResult = oSomeClass.SomeMethod();
    SprintfBox(INFORMATION, "Debug", "oSomeClass.SomeMethod() returned %i.", nResult); // FORNOW
    
    return nResult;
end;

構築したセットアップで実行すると、次SomeFunction()の出力が表示されます...

DotNetCoCreateObject("SomeAssembly.dll", "SomeAssembly.SomeClass", "") を呼び出しています...

oSomeClass.SomeMethod() を呼び出しています...

...、しかし、セットアップは明らかなエラーなしですぐに終了します。何がうまくいかないのかがわからないため、トラブルシューティングが面倒です。考えられる原因を検索しましたが、これまでのところ何も見つかりませんでした。

oSomeClass.SomeMethod()明らかなエラーなしでセットアップがすぐに終了するのはなぜですか?

編集:

@MichaelUrman のコメントによると、機能する既存のクラス ( ) と機能しないOrigClass新しいクラス ( ) の違いについて詳細を尋ねると、次のようになります。SomeClass

  • どちらのクラスもpublic sealed.
  • どちらのクラスにも暗黙のデフォルト コンストラクターがあり、明示的なコンストラクターはありません。
  • 両方の方法 (OrigMethodおよびSomeMethod) はpublicです。
  • クラスもメソッドもComVisible属性でマークされていません。しかし、それらのアセンブリ ( SomeAssembly) に[assembly: ComVisible(true)]AssemblyInfo.cs.

Existing.rul( と正常に統合されるSomeAssembly.OrigClass.OrigMethod) とNew.rul( と正常に統合されない)の違いはSomeAssembly.SomeClass.SomeMethod次のとおりです (パッチ ファイルを使用)。

2c2
< // OrigFunction
---
> // SomeFunction
4c4
< // Wraps SomeAssembly.OrigClass.OrigMethod.
---
> // Wraps SomeAssembly.SomeClass.SomeMethod.
6,7c6,7
< prototype number OrigFunction();
< function number OrigFunction()
---
> prototype number SomeFunction();
> function number SomeFunction()
9c9
<     OBJECT oOrigClass;
---
>     OBJECT oSomeClass;
14c14
<     szAssemblyAndClassName = "SomeAssembly.OrigClass";
---
>     szAssemblyAndClassName = "SomeAssembly.SomeClass";
18c18
<         set oOrigClass = DotNetCoCreateObject(szDLL, szAssemblyAndClassName, "");
---
>         set oSomeClass = DotNetCoCreateObject(szDLL, szAssemblyAndClassName, "");
24,26c24,26
<     SprintfBox(INFORMATION, "Debug", "Calling oOrigClass.OrigMethod()..."); // FORNOW
<     nResult = oOrigClass.OrigMethod();
<     SprintfBox(INFORMATION, "Debug", "oOrigClass.OrigMethod() returned %i.", nResult); // FORNOW
---
>     SprintfBox(INFORMATION, "Debug", "Calling oSomeClass.SomeMethod()..."); // FORNOW
>     nResult = oSomeClass.SomeMethod();
>     SprintfBox(INFORMATION, "Debug", "oSomeClass.SomeMethod() returned %i.", nResult); // FORNOW

OrigFunctionと- -をSomeFunction使用して、とが有効な参照に設定されていることをそれぞれ確認します。InstallScript ランゲージ リファレンスのDotNetCoCreateObject ドキュメントには、「[the] 関数は、オブジェクトを作成できない場合に例外をスローする」と説明されています。trycatchendcatchoOrigClassoSomeClass

4

1 に答える 1

0

問題には簡単な説明があることが判明しました。

SomeMethodinoSomeClass.SomeMethod()と呼び出し可能な.NETメソッドの実際の名前が一致しませんでした。SomeClassoSomeClass.SomeMethod()oSomeClass.SomeOtherMethod()

私の場合、不一致はそれほど劇的ではなく、定義された .NET メソッドの名前で最初に見落としていた複数形が原因oSomeClass.SomeStringMethod()でしoSomeClass.SomeStringsMethod()た。

明らかなエラーなしでセットアップがすぐに終了したため、問題の単純な原因を特定するのは面倒でした.

于 2014-05-09T20:39:08.233 に答える