当前位置: 首页 > 编程语言 > C#

Activator.CreateInstance()在VSIDE内部工作,但不在外部工作分享

时间:2023-04-10 23:08:22 C#

C#学习教程:Activator.CreateInstance()在VSIDE内部工作,但在VSIDE外部不工作因为我知道每个实现COM服务器的CLSID,所以这应该很容易。但是,对于COM库的某个子集,如果我在VS2010IDE中运行,我只能让它工作。这是我用来测试的整个程序:namespaceComTest{classProgram{staticvoidMain(string[]args){varclsid="{E8978DA6-047F-4E3D-9C78-CDBE46041603}";vartype=Type.GetTypeFromCLSID(newGuid(clsid));varobj=Activator.CreateInstance(type,true);Console.WriteLine("对象为{0}",obj);只要我通过VS2010运行,我就可以创建到目前为止尝试过的每个COMCLSID都可以完成这项工作。我从CreateInstance获取System.__ComObject无论是否附加了调试器,无论是否附加了托管进程。当我从控制台窗口编译并运行此代码时,对于某些CLSID值,我得到:UnhandledException:System.Runtime.InteropServices.COMException:CreatinganinstanceoftheCOMcomponentwithCLSID{E8978DA6-047F-4E3D-9C78-IClassFactory中的CDBE46041603}由于以下错误而失败:80004005。skipCheckThis,BooleanfillCache)atSystem.RuntimeType.CreateInstanceDefaultCtor(BooleanpublicOnly,BooleanskipVisibilityChecks,BooleanskipCheckThis,BooleanfillCache)atSystem.Activator.CreateInstance(Typetype,BooleannonPublic)atComTest.StringsProgram[].Main(inThisonlyhappens具有特定CLSID——例如,“{c1243ca0-bf96-11cd-b579-08002b30bfeb}”(内置文本IFilter)有效,但“{E8978DA6-047F-4E3D-9C78-CDBE46041603}”(Acrobat)ReaderXIFilter)我无法弄清楚的是,通过IDE运行如何使COMInterop调用成功有什么不同。有任何想法吗?编辑:我没有以管理员身份运行VS2010,但我尝试通过提升的Powershell控制台运行输出二进制文件,但它仍然不起作用。编辑2:到目前为止,我使用过的唯一重现此“错误”的COM服务器是AcrobatReaderX的AroRdIf.dll(以前的版本运行良好)。我不再担心让Acrobat的特定IFilter工作了,但我非常担心我的代码在我的IDE中运行但不在其中。而且,顺便说一句,WindowsSDKFILTDUMP工具加载这个COM服务器没有问题,所以我知道这是可能的,我只是不知道如何。所以我花了一些时间对其进行测试,并且能够完全按照您的描述重现该问题。我重新创建了您的确切控制台应用程序,我看到了相同的行为,但我想我至少可以添加一些新信息。起初我和你一样以为是那个visualstudio让它起作用了,但事实并非如此。如果将它构建为控制台可执行文件,然后从资源管理器启动它,它工作正常,不涉及visualstudio。我还在开头添加了Debugger.Launch(),这样我就可以在从命令提示符运行时附加到它,即使VS已完全连接并调试,我也会收到错误消息。我的结果都表明不是VS让它工作,它实际上是从破坏它的命令提示符运行它。我已经尝试了各种方法来使命令提示符启动和Windows资源管理器启动之间的环境相同,但我每次都得到相同的结果;在资源管理器中完美运行,在命令行中死机。用反射器四处挖掘,设置通过了所有测试和一切。这是实际调用:RuntimeTypeHandle.CreateInstance(this,publicOnly,noCheck,refcanBeCached,refctor,refbNeedSecurityCheck);在被炸毁的RuntimeType类中,此时没有更多的托管代码可供挖掘。在这一点上,我的猜测是它一定是完全包含在Adob??eCOMServer中的东西,当从命令提示符运行时它会杀死它。也许更了解Windows的人可以阐明从命令行执行命令与从资源管理器执行命令之间的区别?这可能是因为您的应用程序未在VisualStudio之外升级,并且未能获得与COM组件交互的权限。右键单击并以管理员身份运行,看看它是否有所作为。这个问题很旧(并且已经回答),但我想我会添加一些信息。在某些情况下,AdobeX(10.1.x)将无法提供IFilter接口。调用QueryInterface或ClassFactory->CreateInstance或::LoadIFilter或其他任何方法都将失败并返回E_FAIL。我指的是当正在运行的进程不是“作业”的一部分时。即,他们的10.xIFilter检查当前进程是否正在执行任何工作。如果没有,它会失败(至少对我而言)。我的解决方法类似于这样的伪代码:HANDLEcurProc=GetCurrentProcess();BOOLbResult=FALSE;intiResult=IsProcessInJob(curProc,NULL,&bResult);if(iResult!=0&&bResult==FALSE){HANDLEhJob=CreateJobObject(NULL,"whatever");AssignProcessToJob(hJob,curProc);可能会有一个副作用,即新作业获得当前用户的默认安全性。我还有更多的测试要做。我欢迎任何人的意见。我无法重现您描述的问题......一些一般性的检查指示:“从技术上讲,Adobe提供并正确注册了PDF文本提取filterDLL(ACRORDIF.DLL),但它不是通过任何常用方法实例化的,即使用LoadIFilterAPI或使用在查找过滤器对象CLSID后在注册表中创建的直接COM对象。它是否损坏?不,因为不知何故Windows搜索可以使用它!?有些人认为过滤器在STA线程模式下被删除(就像在旧的v6中天)但是ThreadingModel没有证实这一点。一些人谈到只是通过Job对象运行它。Adobe支持让他们处于边缘,声称限制是为了我们的安全-咳咳。“……”你能猜出这一招的原理吗?他们在PDFfilterACRORDIF.DLL中硬编码了MS工具的名称,例如FILTDUMP!所以在实例化一个PDFIFilter对象时,它会检查调用进程名称,如果它在“白名单”中,它就可以工作,否则会出现问题和E_FAIL。诽谤。为了证明,将您的程序重命名为“filtdump.exe”,看起来一切正常,即使是没有作业对象的普通LoadIFilter。“AdobeReader是否支持PDF文本提取?不确定那里发生了什么,但作为一种解决方法,我想知道您是否可以尝试启动该过程……System.Diagnostics.Process.Start("THE_PROCESS.exe");然后,进程运行后,您可以尝试使用ProgID从运行对象表中获取对象...attribute.[STAThread]staticvoidMain(string[]args){...}尝试调用CoInitialize以上是C#学习教程:Activator.CreateInstance()在VSIDE内部有效,在VSIDE外部无效。更多关于C#学习教程,希望大家多多关注——[DllImport("ole32.dll")]staticexternintCoInitialize(IntPtrpvRes);CoInitialize((System.IntPtr)null)本文收集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: