既存の 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] 関数は、オブジェクトを作成できない場合に例外をスローする」と説明されています。try
catch
endcatch
oOrigClass
oSomeClass