C# 从DLL实例化类时的COMException

C# 从DLL实例化类时的COMException,c#,.net,dll,C#,.net,Dll,我一般不熟悉.NET和windows(但有C/C++方面的经验),在尝试实例化dll中定义的类时遇到了问题 我的设置: 在Visual Studio 2013中,我的解决方案包含两个项目: c#windows应用程序(.NET 4.5) 一个C++ DLL(继承了旧代码)——称为DLLIB .DLL< /LI> 作为c#应用程序的预构建步骤,我使用tlbimp从dll生成COM互操作。这给了我interop.dllLib.dll,我在c#项目中添加了它作为参考 当我试图从c#项目实例化一个dll

我一般不熟悉.NET和windows(但有C/C++方面的经验),在尝试实例化dll中定义的类时遇到了问题

我的设置:

在Visual Studio 2013中,我的解决方案包含两个项目:

  • c#windows应用程序(.NET 4.5)
  • 一个C++ DLL(继承了旧代码)——称为DLLIB .DLL< /LI> 作为c#应用程序的预构建步骤,我使用tlbimp从dll生成COM互操作。这给了我interop.dllLib.dll,我在c#项目中添加了它作为参考

    当我试图从c#项目实例化一个dll类(称为交换机)时,我得到以下错误:

    dllLib.switcher myclass=新的dllLib.switcher()

    mscorlib.dll中发生“System.Runtime.InteropServices.COMException”类型的异常,但未在用户代码中处理 其他信息:检索CLSID为{D7EBBF24-5620-4AED-871B-2027471FD075}的组件的COM类工厂失败,原因是 导致以下错误:80040154类未注册(来自 HRESULT:0x80040154(REGDB_E_CLASSNOTREG))

    我被难住了。dll注册没有问题(regsvr32工作)。c#应用程序可以看到“交换台”类的界面,并且编译时毫无怨言

    我已经尝试/检查过的内容:

    • 以管理员身份运行VisualStudio

    • 活动解决方案是调试x86

    • 项目上下文是x86(c#)和Win32(dll)

    • regsvr32/n/i:user dllLib.dll是成功的,但有趣的是,使用/u注销它失败

    注销dll时出现错误消息:

    调用DllUnregisterServer失败,错误代码为0x8002801c


    非常感谢您就尝试什么或疑难解答提供的任何建议。

    运行regsvr32当前目录应与您尝试注册的dll位于同一目录中。当您注册此com dll时,它需要位于正在生成的调试或发布目录中。稍后您可以克服这些限制,但这可能会为您清除一两个细节,以便您现在看到类的创建和实例化。以管理员身份运行VS是相关的。执行干净的构建有时会导致问题。确保您的com dll在目录中也有它的依赖项。好的,我刚刚意识到运行regsvr32 dllLib.dll允许代码在不引发异常的情况下运行。它还允许我毫无怨言地注销dll。我继承的dll代码在regsvr32 post-build命令上使用了/n/I:user标志,但我对Windows的无知意味着我不清楚这有什么用途。执行此操作是否有安全原因?Run regsvr32当前目录应与您尝试注册的dll位于同一目录中。当您注册此com dll时,它需要位于正在生成的调试或发布目录中。稍后您可以克服这些限制,但这可能会为您清除一两个细节,以便您现在看到类的创建和实例化。以管理员身份运行VS是相关的。执行干净的构建有时会导致问题。确保您的com dll在目录中也有它的依赖项。好的,我刚刚意识到运行regsvr32 dllLib.dll允许代码在不引发异常的情况下运行。它还允许我毫无怨言地注销dll。我继承的dll代码在regsvr32 post-build命令上使用了/n/I:user标志,但我对Windows的无知意味着我不清楚这有什么用途。这样做有安全理由吗?