.net 4.0 安装程序正在退出,调用.NET方法时没有明显错误

.net 4.0 安装程序正在退出,调用.NET方法时没有明显错误,.net-4.0,installscript,installshield-2012,.net 4.0,Installscript,Installshield 2012,我正在扩展现有的InstallScript项目,需要在以.NET 4.0为目标的程序集中调用方法 该项目已经在同一程序集中的另一个类中调用了一个方法:因此我知道有很多方法是可行的 根据我对现有.NET方法调用的了解,以下是我到目前为止的了解: ////////////////////////////////////////////////////////////////////////////// // SomeFunction // // Wraps SomeAssembly.SomeClas

我正在扩展现有的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
)之间存在哪些差异的详细信息,新类(
SomeClass
):

  • 这两个类别都是
    公共密封的
  • 这两个类都有一个隐式默认构造函数-没有显式构造函数
  • 这两种方法(
    OrigMethod
    SomeMethod
    )都是
    public
  • 类或方法都没有标记为;但是它们的程序集(
    SomeAssembly
    )在其
    AssemblyInfo.cs
    中有
    [assembly:ComVisible(true)]
Existing.rul
(成功集成
SomeAssembly.OrigClass.OrigMethod
)和
New.rul
(未成功集成
SomeAssembly.SomeClass.SomeMethod
)之间的区别如下(使用补丁文件):

2c2
//SomeFunction
4c4
//包装SomeAssembly.SomeClass.SomeMethod。
6,7c6,7
原型编号SomeFunction();
>函数号SomeFunction()
9c9
<对象类;
---
>对象类;
14c14
szAssemblyAndClassName=“SomeAssembly.SomeClass”;
18c18
设置oSomeClass=DotNetCoCreateObject(szDLL,szAssemblyAndClassName,“”);
24,26c24,26
SprintfBox(信息,“调试”,“调用oSomeClass.SomeMethod()…”);//目前
>nResult=oSomeClass.SomeMethod();
>SprintfBox(信息,“调试”,“oSomeClass.SomeMethod()返回%i.”,nResult);//目前

OrigFunction
SomeFunction
使用
try
-
catch
-
endcatch
分别确保
oOrigClass
oSomeClass
设置为有效引用。InstallScript语言参考说明“如果无法创建对象,[The]函数会引发异常”。

问题的解释很简单

oSomeClass.SomeMethod()
中的
SomeMethod
与可调用的.NET
SomeClass
方法的实际名称不匹配-即
oSomeClass.SomeMethod()
应该是
oSomeClass.SomeOtherMethod()

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


安装程序在没有任何明显错误的情况下立即退出,这使得确定问题的简单原因变得非常困难。

您能否提供更多关于有效类和无效类之间区别的详细信息?我怀疑与
ComVisible
public
有关,因为您似乎没有测试
oSomeClass
是否收到有效的引用。@MichaelUrman:我更新了问题,提供了有关可用类和不可用类的更多详细信息
SomeFunction
使用
try
-
catch
-
endcatch
确保
oSomeClass
设置为有效引用。InstallScript语言参考说明“如果无法创建对象,[The]函数会引发异常”。@MichaelUrman:感谢您的输入-概述了要检查的内容,这些内容很可能是问题的根源。我找到了原因,并在自我回答中指出了这一点。
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