我被迫在应用程序中使用第三方COM组件,并且在添加对项目的引用时遇到问题。
我之前已将此DLL添加为项目的引用,但在过去它会直接链接到DLL,以便" Path"在引用的属性中将是安装DLL的文件系统路径(即不相对于我的解决方案的目录)。但是,现在,当我添加引用时," Path"是我的项目的obj
目录,"嵌入互操作类型"设置为True,并将其列为ActiveX组件(不正确)。
然后,我偶然发现了this MSDN article,其中说:
如果要添加对包含内部清单的已注册COM DLL的引用,请首先取消注册DLL。否则,Visual Studio会将程序集引用添加为ActiveX控件而不是本机DLL。
嗯,你有它。那是我的确切问题。我需要本机DLL,但我得到的是ActiveX控件。所以,我按照它建议并取消注册了DLL。但是,当我尝试添加引用时,我收到一条错误消息:
无法添加对...的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件。
如果我再次注册DLL,我可以添加它作为参考,但同样,它被添加为ActiveX控件。在这一点上,我不知道还能做什么。 Microsoft非常清楚我必须在将其添加为引用之前取消注册,但是Visual Studio 2013显然不会让我添加未注册的DLL。任何人都知道如何解决这个问题?
更新
所以,显然最近这个应用程序的更新使COM成为唯一的选择(不直接使用DLL)。它被添加为ActiveX的事实并不意味着什么。问题是,这是一个试图以64位运行的32位库。我知道这是一个潜在的问题,但是将平台目标切换到x86仍然会导致错误,所以我最终追了一个红鲱鱼。事实证明,即使您正在调试的站点的平台目标是32位,IIS Express 8本机也会以64位运行。我不得不进入Visual Studio选项并取消选中告诉IIS Express运行64位的标志(在" Web Projects"下)然后一切正常。
答案 0 :(得分:0)
因此,由于添加已注册的DLL几乎是不行,所以我专注于试图弄清楚为什么Visual Studio在取消注册时不允许我添加它。我的意思是,当我尝试运行项目时,我可能会得到一个关于它是未注册的DLL的错误,但它至少应该让我作为参考添加它,无论如何。
我最终偶然发现tlbimp.exe
,根据微软的说法:
类型库导入器将COM类型库中找到的类型定义转换为公共语言运行库程序集中的等效定义。 Tlbimp.exe的输出是一个二进制文件(程序集),它包含原始类型库中定义的类型的运行时元数据。
好。好吧无论如何,我打开了一个Visual Studio Developer Prompt(常规cmd
在路径上没有tlbimp.exe
),并通过它运行我的DLL。它创建了一个新的DLL,我 能够添加作为参考,它满足了我的项目依赖性。但是,我还没有对它进行测试,以确保一旦这个东西运行,一切仍然可以正常运行,所以我会用我在那里找到的东西进行更新。
<强>更新强>
是的,所以这也不起作用。一旦它运行说我的课程没有注册,我就会得到同样的错误。只有现在,我才能注册这个DLL,因为tlbimp.exe
删除了入口点。