.net 4.0 安装程序正在退出,调用.NET方法时没有明显错误
我正在扩展现有的InstallScript项目,需要在以.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
//////////////////////////////////////////////////////////////////////////////
// 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
/OrigFunction
---
>//SomeFunction
4c4
/包装SomeAssembly.OrigClass.OrigMethod。
---
>//包装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
与可调用的.NETSomeClass
方法的实际名称不匹配-即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