我正在扩展现有的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
。OrigMethod
和SomeMethod
)都是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
OrigFunction
和SomeFunction
使用try
- catch
-endcatch
分别为确保oOrigClass
并oSomeClass
设置为一个有效的参考。InstallScript语言参考的DotNetCoCreateObject文档说明“如果无法创建对象,此函数将引发异常”。
原来,这个问题有一个简单的解释。
SomeMethod
inoSomeClass.SomeMethod()
和可用于调用的.NET方法的实际名称之间不匹配SomeClass
-即oSomeClass.SomeMethod()
应该是oSomeClass.SomeOtherMethod()
。
就我而言,这种失配并不是那么严重,而仅仅是由于复数形式,我最初在定义的.NET方法的名称中忽略了-例如oSomeClass.SomeStringMethod()
(单数)oSomeClass.SomeStringsMethod()
(复数)在哪里。
安装程序立即退出,没有任何明显的错误,这使它很容易识别问题的简单原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句