Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为COM互操作注册x64程序集时出现问题_C#_.net_Registry - Fatal编程技术网

C# 为COM互操作注册x64程序集时出现问题

C# 为COM互操作注册x64程序集时出现问题,c#,.net,registry,C#,.net,Registry,我已经开发了一个示例c#COM可视DLL。 内置于x86中,通过32位Regasm注册,可在COM客户端正常运行。 内置x64并通过64位Regasm注册,COM客户端调用会删除以下错误: Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154. 我检查并确保HKCR\C

我已经开发了一个示例c#COM可视DLL。
内置于x86中,通过32位Regasm注册,可在COM客户端正常运行。
内置x64并通过64位Regasm注册,COM客户端调用会删除以下错误:

Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154.
我检查并确保HKCR\CLSID下的注册表中确实存在CLSID

下面是一个通过c#模拟COM访问的示例:

var type=type.GetTypeFromProgID(“ProgID.Interop.5683”);

var obj=Activator.CreateInstance(类型);// 经过一夜的睡眠和一点后见之明,我发现需要从x64应用程序调用Activator,通过查找注册表中的x64位置来查找x64 CLSID。 i、 当从x86应用程序调用时,Activaor会在注册表中的x86位置查找CLSID和包括代码库在内的后续键

var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type); 

经过一夜的睡眠和一点后见之明,我发现需要从x64应用程序调用Activator,通过查找注册表中的x64位置来查找x64 CLSID。 i、 当从x86应用程序调用时,Activaor会在注册表中的x86位置查找CLSID和包括代码库在内的后续键

var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type); 

当CLSID不存在或不在正确的预期位置时,在什么情况下抛出80040154错误?@Ramhound。所以我很困惑,你没有为一个特定的架构建立一个托管DLL,只有EXE项目的设置才重要。经典错误是使用了错误的Regasm.exe位或忘记了/codebase选项。使用SysInternals的ProcMon实用程序进行故障排除。@HansPassant我在x64(V2和V4)中使用了两种风格的Regasm,或者注意在attemps之间注销,并且我确实使用了/codebase wich,并且如上所述,我还使用了ProcMon来监视时间,以进行一些注册表潜水。转到HKEY\U CLASSES\U ROOT\CLSID。您应该在下面找到{A0F2F58F-7B98-3605-BEC9-84724FF1E824}的键。在该键下,您将在InprocServer32键下找到对象的程序集所在位置的信息。请注意,这将适用于x64系统上的tbe x64对象。在什么情况下会引发80040154错误?@Ramhound当CLSID不存在或不在正确的预期位置时。所以我很困惑,你没有为一个特定的架构建立一个托管DLL,只有EXE项目的设置才重要。经典错误是使用了错误的Regasm.exe位或忘记了/codebase选项。使用SysInternals的ProcMon实用程序进行故障排除。@HansPassant我在x64(V2和V4)中使用了两种风格的Regasm,或者注意在attemps之间注销,并且我确实使用了/codebase wich,并且如上所述,我还使用了ProcMon来监视时间,以进行一些注册表潜水。转到HKEY\U CLASSES\U ROOT\CLSID。您应该在下面找到{A0F2F58F-7B98-3605-BEC9-84724FF1E824}的键。在该键下,您将在InprocServer32键下找到对象的程序集所在位置的信息。请注意,这将适用于x64系统上的x64对象。这是因为x86和x64 EXE/DLL(COM或其他)不混合,就像和like一样。@sixlettervariables:是的,这是我在这里学到的另一个问题:这是因为x86和x64 EXE/DLL(COM或其他)不混合,像和like一样。@sixlettervariables:是,这是我从这里的另一个问题中学到的: