想要在已部署的计算机上使用COM dll文件而不注册dll文件

时间:2011-10-09 18:12:33

标签: c# dll com codedom

我会说这很简单,因为它很快就会变得很混乱。我有一个COM dll(用VB6制作),我希望能够通过我的C#应用​​程序使用它。以下是我采取的步骤和结果。

  1. 通过Visual Basic 6创建COM dll
  2. 将COM dll添加到.Net应用程序。
  3. 检索.Net在x86 / Debug
  4. 中生成的“interop.dllName.dll”文件
  5. interop 文件添加为我的CodeDom生成的exe文件的引用程序集。
  6. 当.exe文件与interop.dllname.dll文件位于同一目录时,CodeDom生成的.exe文件在我的机器上运行得很漂亮
  7. CodeDom生成的.exe文件在已部署的计算机上完成了 ,即使interop.dllname.dll文件与.exe位于同一目录中文件。
  8. 请注意:

    • 原始COM .dll未在已部署的计算机上注册,因为部署的计算机无法将COM .dll识别为有效的dll文件。

    • COM .dll是在x86环境下制作的,而部署的计算机是在x64环境中运行的(这有什么不同)?

    我的目标是什么: 我希望能够运行CodeDom生成的.exe文件,而不依赖于interop.dllname.dll文件。有没有办法将这些DLL文件存储在内存中?此外,我不希望我的用户必须先注册dll文件才能使用CodeDom生成的.exe文件。有什么方法可以这样做吗?

    我感谢你对此事的任何帮助。

    感谢您的时间,

    埃文

3 个答案:

答案 0 :(得分:3)

听起来很像你有一个简单的32/64位不匹配。由于您的COM DLL是32位,您需要:

  1. 确保使用此COM DLL的应用程序以x86为目标。
  2. 使用32位版本的regsvr32注册COM DLL,该版本位于64位计算机上的SysWow64文件夹中。
  3. 我的猜测是你试图注册64位版本的regsvr32。如果你确定注册和消费涉及的所有内容都是32位,那么你应该没事。

答案 1 :(得分:2)

  1. 64位进程无法加载32位dll。缓解这种情况的一种方法是确保.NET应用程序仅针对32位编译(在Visual Studio中称为x86)
  2. 为了消除对interop dll的依赖,请在VS2010中评估选项'Embed Interop Types'。我自己没有对此进行测试,但我相信它已经添加到像你这样的场景中。
  3. 对于免注册COM,我认为文章可以作为您的起点:http://msdn.microsoft.com/en-us/magazine/cc188708.aspx#S1

答案 2 :(得分:1)

第一个问题,interop.name.dll库可以通过反编译轻松解决。只需反编译库并将源代码包含在原始库中。您可以使用任何反编译工具,IlSpy应该这样做。

对于COM,存在一种称为“注册免费COM”的技术,它已在Windows XP中引入,更多内容在此http://msdn.microsoft.com/pl-pl/magazine/cc188708(en-us).aspx。虽然它肯定有效,但我不确定你是否会因为x86-x64不匹配而遇到任何问题。