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

J0e3gan

我正在扩展现有的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文档说明“如果无法创建对象,此函数将引发异常”。

J0e3gan

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

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

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

安装程序立即退出,没有任何明显的错误,这使它很容易识别问题的简单原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有什么方法可以安装需要.net 3.5而又没有.net 3.5的应用程序?

来自分类Dev

有没有一种方法可以检测使用本地C#调用的系统上安装了哪些Windows Store应用程序?

来自分类Dev

退出程序而没有coredump或分段错误

来自分类Dev

从VBA调用.net库方法

来自分类Dev

VB.NET调用方法

来自分类Dev

MVC .NET Core - 调用方法

来自分类Dev

Mongodb(代码已退出,状态= 14)失败,但没有任何明显的错误

来自分类Dev

jQuery ajax调用ASP.NET调用错误的方法

来自分类Dev

jQuery ajax调用ASP.NET调用错误的方法

来自分类Dev

有没有更简单的循环来进行错误检查和退出的方法?(C字符串/字符数组)

来自分类Dev

有没有比在存储库(CENTOS)中安装更新程序包的简便方法?

来自分类Dev

有没有一种方法可以在Linux上安装程序的多个版本?

来自分类Dev

在没有可用的dns的情况下如何使用debian net安装程序?

来自分类Dev

找不到请求的.Net Framework数据提供程序。它可能没有安装

来自分类Dev

Microsofi .NET Framework Windows 10在安装之前没有被几个程序看到

来自分类Dev

找不到请求的.Net Framework数据提供程序。它可能没有安装

来自分类Dev

安装 Visual Studio Build Tools 2017 时没有“ASP.NET MVC 4”程序集

来自分类Dev

没有调用centralManager方法

来自分类Dev

委托方法没有被调用?

来自分类Dev

Bean方法没有被调用

来自分类Dev

没有调用onDowngrade()方法

来自分类Dev

Appirater方法没有被调用

来自分类Dev

Mailer方法没有被调用?

来自分类Dev

片段方法没有被调用

来自分类Dev

没有调用centralManager方法

来自分类Dev

UITabBarControllerDelegate方法没有被调用

来自分类Dev

UITabBarControllerDelegate 的方法没有被调用

来自分类Dev

Prediction.io应用程序无法在SecureRandom方法上创建失败,因为表events_1没有退出

来自分类Dev

未调用流程退出事件处理程序方法

Related 相关文章

  1. 1

    有没有什么方法可以安装需要.net 3.5而又没有.net 3.5的应用程序?

  2. 2

    有没有一种方法可以检测使用本地C#调用的系统上安装了哪些Windows Store应用程序?

  3. 3

    退出程序而没有coredump或分段错误

  4. 4

    从VBA调用.net库方法

  5. 5

    VB.NET调用方法

  6. 6

    MVC .NET Core - 调用方法

  7. 7

    Mongodb(代码已退出,状态= 14)失败,但没有任何明显的错误

  8. 8

    jQuery ajax调用ASP.NET调用错误的方法

  9. 9

    jQuery ajax调用ASP.NET调用错误的方法

  10. 10

    有没有更简单的循环来进行错误检查和退出的方法?(C字符串/字符数组)

  11. 11

    有没有比在存储库(CENTOS)中安装更新程序包的简便方法?

  12. 12

    有没有一种方法可以在Linux上安装程序的多个版本?

  13. 13

    在没有可用的dns的情况下如何使用debian net安装程序?

  14. 14

    找不到请求的.Net Framework数据提供程序。它可能没有安装

  15. 15

    Microsofi .NET Framework Windows 10在安装之前没有被几个程序看到

  16. 16

    找不到请求的.Net Framework数据提供程序。它可能没有安装

  17. 17

    安装 Visual Studio Build Tools 2017 时没有“ASP.NET MVC 4”程序集

  18. 18

    没有调用centralManager方法

  19. 19

    委托方法没有被调用?

  20. 20

    Bean方法没有被调用

  21. 21

    没有调用onDowngrade()方法

  22. 22

    Appirater方法没有被调用

  23. 23

    Mailer方法没有被调用?

  24. 24

    片段方法没有被调用

  25. 25

    没有调用centralManager方法

  26. 26

    UITabBarControllerDelegate方法没有被调用

  27. 27

    UITabBarControllerDelegate 的方法没有被调用

  28. 28

    Prediction.io应用程序无法在SecureRandom方法上创建失败,因为表events_1没有退出

  29. 29

    未调用流程退出事件处理程序方法

热门标签

归档