我正在扩展现有的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
。OrigMethod
和SomeMethod
)均为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
OrigFunction
和SomeFunction
使用try
- catch
- endcatch
分别确保设置oOrigClass
和oSomeClass
有效的参考。 InstallScript语言参考的DotNetCoCreateObject documentation解释说,如果无法创建对象,“[该]函数会抛出异常”。
答案 0 :(得分:0)
问题结果是一个简单的解释。
SomeMethod
中的oSomeClass.SomeMethod()
与可用于调用的.NET SomeClass
方法的实际名称之间存在不匹配 - 即oSomeClass.SomeMethod()
应该是oSomeClass.SomeOtherMethod()
。
在我的情况下,不匹配并不是那么激烈,仅仅是因为我在定义的.NET方法名称中最初忽略了多元化 - 例如oSomeClass.SomeStringMethod()
(单数)其中oSomeClass.SomeStringsMethod()
(复数)是有序的。
如果设置立即退出而没有任何明显的错误,那么就可以找出问题的简单原因。