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.
  • 这两个类都有一个隐式默认构造函数——没有显式构造函数。
  • 两种方法 (OrigMethodSomeMethod) 都是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

OrigFunctionSomeFunction使用try- catch-endcatch分别确保oOrigClassoSomeClass设置为有效参考。InstallScript 语言参考的DotNetCoCreateObject 文档解释说“如果无法创建对象,[the] 函数将引发异常”。

4

1 回答 1

0

这个问题原来有一个简单的解释。

SomeMethodinoSomeClass.SomeMethod()和可调用的 .NET方法的实际名称不匹配- 即应该是。SomeClassoSomeClass.SomeMethod()oSomeClass.SomeOtherMethod()

就我而言,这种不匹配并没有那么严重,仅仅是由于我最初在定义的 .NET 方法的名称中忽略了复数形式——例如oSomeClass.SomeStringMethod()(单数),其中oSomeClass.SomeStringsMethod()(复数)是有序的。

安装程序立即退出而没有任何明显的错误,这使得确定问题的简单原因成为一个鼻屎。

于 2014-05-09T20:39:08.233 回答