我正在扩展现有的 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
使用try
- catch
-endcatch
分别确保oOrigClass
和oSomeClass
设置为有效参考。InstallScript 语言参考的DotNetCoCreateObject 文档解释说“如果无法创建对象,[the] 函数将引发异常”。