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

时间:2014-05-07 02:45:03

标签: .net-4.0 installscript installshield-2012

我正在扩展现有的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()导致设置立即退出而没有明显错误?

修改

Per @ MichaelUrman的评论要求提供有关现有类(OrigClass)和新组(SomeClass)之间有何不同之处的详细信息:

  • 这两个班级都是public sealed
  • 这两个类都有一个隐式默认构造函数 - 没有显式构造函数。
  • 两种方法(OrigMethodSomeMethod)均为public
  • 类别或方法均未标有ComVisible attribute;但是他们的汇编(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 documentation解释说,如果无法创建对象,“[该]函数会抛出异常”。

1 个答案:

答案 0 :(得分:0)

问题结果是一个简单的解释。

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

在我的情况下,不匹配并不是那么激烈,仅仅是因为我在定义的.NET方法名称中最初忽略了多元化 - 例如oSomeClass.SomeStringMethod()(单数)其中oSomeClass.SomeStringsMethod()(复数)是有序的。

如果设置立即退出而没有任何明显的错误,那么就可以找出问题的简单原因。