【问题标题】:Coldfusion Lack of error information when instantiating a .Net referenceColdfusion 实例化 .Net 引用时缺少错误信息
【发布时间】:2014-05-13 21:59:00
【问题描述】:

所以我正在使用 Microsoft Office Open XML SDK,并尝试在我的 CF 10 实例中实例化它的类。

我开始尝试创建一个DocumentType 类,所以我使用了代码:

writeDump(createObject("dotnet","DocumentFormat.OpenXml.Wordprocessing.DocumentType","C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll").DocumentType());abort;

不过,这给了我一个错误,没有有用的信息。

然后我读到您还需要在类信息中包含命名空间。然而,这也会导致错误,但有一些不错的信息:

在指定的程序集列表中找不到类 DocumentFormat.OpenXml.Wordprocessing.DocumentFormat.OpenXml.Wordprocessing.DocumentType。

必须将包含该类的程序集提供给程序集属性。

我现在对此有些困惑。我是不是在做一些明显的错误。

作为第二点,有没有办法转储 DLL 包含的所有我可以引用的类?

编辑

按照 cmets 中@Leigh 的建议将代码更改为:

writeDump(createObject("dotnet","DocumentFormat.OpenXml.Wordprocessing.DocumentType","C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll"));abort;

在:C:\ColdFusion10\cfusion\jnbridge\error.log 中产生此错误

======================
13/05/2014 23:23:53
Java-side exception: com.jnbridge.jnbcore.ClassNotFoundException
Java-side exception message: java.lang.Class+EnclosingMethodInfo
Java-side stack trace: com.jnbridge.jnbcore.ClassNotFoundException:
java.lang.Class+EnclosingMethodInfo
at com.jnbridge.jnbproxy.ClassInfo.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.jnbridge.jnbcore.JNBDispatcher.construct(Unknown Source)
at com.jnbridge.jnbcore.JNBDispatcher.call(Unknown Source)
at com.jnbridge.jnbcore.server.b.d.a(Unknown Source)
at com.jnbridge.jnbcore.server.b.c.p(Unknown Source)
at com.jnbridge.jnbcore.server.b.c.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)

.NET-side stack trace = .NET-side stack trace:

at com.jnbridge.jnbproxy.ExceptionFactory.throwException(JNBException e, Hashtable objMap)
at com.jnbridge.jnbproxy.ClassInfo..ctor(String name)
at com.jnbridge.jnbcore.ObjectHelper.getSubstituteProxy(String returnedType, Type expectedType)
at com.jnbridge.jnbproxy.ProxyClass.getSubstituteProxy(String className)
at com.jnbridge.jnbproxy.ProxyClass.getType(String className, Boolean noSubstituteProxy)
at com.jnbridge.jnbproxy.ProxyClass.isThreadTrue(String className, Hashtable threadTrue, ClassInfo ci)
at com.jnbridge.jnbproxy.ProxyClass.generateProxyClassMembers(ModuleBuilder module, ClassInfo ci, Boolean verbose, Boolean noSupporting, Boolean isJSharpCompatible, ReferenceValueData refValData, Hashtable threadTrue, Boolean mapEnums)
at com.jnbridge.jnbproxy.ProxyAssembly.addClass(ClassInfo ci)
at com.jnbridge.jnbcore.ObjectHelper.getSubstituteProxy(String returnedType, Type expectedType)
at com.jnbridge.jnbproxy.ProxyClass.getSubstituteProxy(String className)
at com.jnbridge.jnbproxy.ProxyClass.getType(String className, Boolean noSubstituteProxy)
at com.jnbridge.jnbproxy.ProxyField.genClassLiteral(TypeBuilder theClass, ReferenceValueOptions rvo)
at com.jnbridge.jnbproxy.ProxyClass.generateProxyClassMembers(ModuleBuilder module, ClassInfo ci, Boolean verbose, Boolean noSupporting, Boolean isJSharpCompatible, ReferenceValueData refValData, Hashtable threadTrue, Boolean mapEnums)
at com.jnbridge.jnbproxy.ProxyAssembly.addClass(ClassInfo ci)
at com.jnbridge.jnbcore.ObjectHelper.getSubstituteProxy(String returnedType, Type expectedType)
at com.jnbridge.jnbproxy.ProxyClass.getSubstituteProxy(String className)
at com.jnbridge.jnbproxy.ProxyClass.getType(String className, Boolean noSubstituteProxy)
at com.jnbridge.jnbproxy.ProxyClass.isThreadTrue(String className, Hashtable threadTrue, ClassInfo ci)
at com.jnbridge.jnbproxy.ProxyClass.generateProxyClassMembers(ModuleBuilder module, ClassInfo ci, Boolean verbose, Boolean noSupporting, Boolean isJSharpCompatible, ReferenceValueData refValData, Hashtable threadTrue, Boolean mapEnums)
at com.jnbridge.jnbproxy.ProxyAssembly.addClass(ClassInfo ci)
at com.jnbridge.jnbcore.ObjectHelper.getSubstituteProxy(String returnedType, Type expectedType)
at com.jnbridge.jnbproxy.ExceptionFactory.throwException(JNBException e, Hashtable objMap)
at com.jnbridge.jnbcore.ProxyJarFile.close()
at com.jnbridge.jnbproxy.JNBProxy.generateJavaProxies(String[] classes, Options options, AppDomain dotNetAssembliesAppDomain, Hashtable refValueMap, Hashtable threadTrue)
at com.jnbridge.jnbproxy.JNBProxy.Main(String[] args)

Java-side stack trace:

com.jnbridge.jnbcore.ClassNotFoundException: java.lang.Class+EnclosingMethodInfo
at com.jnbridge.jnbproxy.ClassInfo.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.jnbridge.jnbcore.JNBDispatcher.construct(Unknown Source)
at com.jnbridge.jnbcore.JNBDispatcher.call(Unknown Source)
at com.jnbridge.jnbcore.server.b.d.a(Unknown Source)
at com.jnbridge.jnbcore.server.b.c.p(Unknown Source)
at com.jnbridge.jnbcore.server.b.c.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)`

【问题讨论】:

  • 最后的.DocumentType() 看起来不对劲。如果您尝试调用类的无参数构造函数,请使用特殊的 .init() 方法。但是现在,删除那部分并转储:createObject("dotnet", "DocumentFormat.OpenXml.Wordprocessing.DocumentType", {path to dll});
  • @Leigh 这给了我原来的截图错误。
  • (编辑)可能它需要的不仅仅是 OpenXML dll。我曾经发生过这种情况,并且这些错误同样没有提供信息。检查 .net 错误日志以查看它是否包含更多详细信息。它应该在jnbridge` or the standard logs`目录下。
  • 已编辑以包含 JNBridge 错误日志@Leigh
  • 不幸的是,这个错误信息也不是很丰富;)它都是通用反射的东西,没有提到特定的类。我只安装了 v2.0,但使用...\Open XML SDK\V2.0\... 作为装配路径对我来说适用于 CF10.0。试一试咧嘴一笑。如果遇到同样的错误,请尝试清除 the proxy files (except dotNetCoreProxy.jar) ,然后重试。

标签: c# .net dll coldfusion ms-office


【解决方案1】:

我以前遇到过这个问题。发生的情况是 .Net 代码返回了一个没有代理的类,或者抛出了 jnbridge/CF .Net 没有代理的 SomeClass.CustomException 类型的异常。在这两种情况下都返回“ClassNotFound”。

我所做的是提前将这些类添加到程序集列表中并实例化,然后转储它们(这样就构建了类代理)。

<!--- Instantiate our exception classes to ensure the proxies exists --->
<cfset nullObj=CreateObject(".net","System.Net.WebExceptionStatus","C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll")>
<cfset nullObj=CreateObject(".net","System.Net.WebResponse","C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll")>
<cfset nullObj=CreateObject(".net","System.Net.HttpStatusCode","C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll")>

<!--- Create our Web Request class --->
<cfset webReq=CreateObject(".net","OURCUSTOMWRAPPER.HTTP.HTTPXMLWebRequest","C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll,C:\resources\utilities\OURCUSTOMWRAPPERLibray.dll")>

【讨论】:

  • 是的,我也是leaning towards missing classes 的可能原因。问题在于找出哪一个:/ 当我遇到这个问题时,日志通常包含有问题的类的名称,但在这种情况下,除了通用反射之外什么都没有......
  • 如果您有权访问 Visual Studio 以在那里执行项目,或者使用 Powershell 尝试实例化并调用调用以查看幕后发生的情况。还要检查文档以查看返回了哪些类以及是否发生错误,这也可能有所帮助。
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 2017-11-25
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2013-11-22
  • 2012-09-07
  • 2017-11-22
相关资源
最近更新 更多