任何机构都可以告诉我regsvr32和RegAsm有什么区别?我的Dll在C#中,那么如何将类导入到c ++中呢?
我已经为COM互操作创建了一个.NET程序集,它在我的开发机器上运行良好.我目前正试图弄清楚如何使用Visual Studio的"安装项目"将DLL部署到目标机器.如何使用VIsual Studio安装项目执行以下操作:
regasm).
gacutil)
任何其他建议或关注将不胜感激.
我有一个用C#编写的COM可见DLL,我想在VB6应用程序中使用它.我有两个DLL的主要用例,我想知道该/codebase选项何时适用以及何时最好在GAC中注册.
用例:
DLL将被加载到另一台开发人员PC上,并且需要在Project > References菜单下的VB6 IDE中访问
当VB6应用程序发布时,DLL将被加载到生产机器上
有关适当使用的任何信息/codebase都会有所帮助.
谢谢.
我有一个由C#编写的DLL文件,我的系统是Windows 7 64位.当我应用RegAsm时,它没有将注册表添加到64位路径,而只是将其添加到32位路径.
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /register /codebase "C:\o.dll"
Run Code Online (Sandbox Code Playgroud)
然后,如果我在regedit.exe中检查我的GUID,我看到我只在32位注册表路径中有它: HKEY_CLASSES_ROOT\CLSID\{... my guid is found here ....}
代替 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{... not found my guid ...}
因此,我有其他问题.任何人都可以建议发生了什么以及为什么它没有制作32位和64位注册表项?"
最近,我在C#中编写了一个类库,用于Office应用程序,包括约70人使用的关键Access应用程序.对于具有管理员权限的用户,注册DLL很简单,但让DLL在其他计算机上运行是有问题的.
RegAsm YourDll.dll /tlb /codebaseYourDll.tlb在VBA中添加引用:工具 - >引用Regasm在这里做了几件事.首先,它创建了一个类型库(YourDLL.tlb),它提供有关DLL中的类的信息.其次,它将有关库的信息存储在注册表中,以便系统"知道"当您要求将类实例化为对象时的含义.
要查看Regasm添加的注册表项,可以使用以下/regfile参数运行它:
Regasm YourDLL.dll /codebase /regfile
(该/regfile选项对/tlb参数无效.)
如果该/codebase选项告诉Regasm包含有关YourDLL.dll磁盘位置的信息,这对于创建对象很重要.
如果您YourDLL.reg在文本编辑器中打开,您将看到Regasm添加到注册表的条目:条目HKEY_Classes_Root(实际上只是重定向到HKLM\Software\Classes).不幸的是,您需要管理员权限才能修改HKLM,因此这对我们的其他用户无效.
还有一些其他线程(例如,注册没有管理员权限的COM,注册COM DLL供VBA使用,注册DLL(ActiveX)用于非管理员用户,无法注册.NET COM DLL,COM Interop没有regasm)讨论问题,但他们的解决方案是复杂的(例如需要注册表重定向)或不完整(假设你已经知道至少一半的答案)或不适用于混合64/32位环境(例如Win64,Office32).
那么如何在没有管理权限的情况下注册在Visual Studio中创建的COM DLL,以便在当前用户的VBA 32和64位环境中使用?
我有一个ac#assembly,我正在通过COM从Delphi(win32 native)应用程序调用它.
这适用于我测试过的所有机器,除了一台.
问题是Delphi应用程序在尝试创建COM对象时获得"Class not registered".
现在,当我查看下面的注册表时HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID,列出的GUID与AssemblyInfo.cs中的程序集Guid不同.它应该是相同的 - 它在安装它的所有其他计算机上是相同的.
我试过了regasm /unregister delphitocsharp.dll,删除了注册表项.然后如果我这样做regasm delphitocsharp.dll,注册表键返回,但GUID与之前相同(即错误),Delphi仍然获得"Class not registered".
工作机器上的DelphiToCSharp.dll与非工作机器上的版本完全相同(通过md5验证).
我能想到的只是之前注册了一个旧版本的dll,并且仍然存在一些使该文件混乱的文件的残余.
我该如何修复或至少进一步诊断此问题?
此处描述了在没有管理员权限的情况下调用regasm的解决方法:
我正在尝试创建一个COM库,我的用户可以在没有管理员权限的情况下从Excel VBA部署和使用它.我喜欢regasm解决方法,因为似乎人们在使用Excel VBA中的免注册COM对象方面没有太大成功.我也希望早期绑定,以便我的用户可以从语法完成中受益.
但是,上述问题中接受的答案并未描述将汇编dll放在用户计算机上的位置.管理员权限是在GAC中安装程序集所必需的,所以我想知道在哪里可以放置dll文件.我假设应用程序的目录正在搜索任何引用的dll,但我不能将我的dll放在Excel的目录中而没有管理员权限.是否可以使用Excel客户端的变通方法?有没有其他方法从VBA调用COM对象而不需要管理员权限来首先部署它们?
在VC++项目中,我试图创建一个包含在C#项目中的C#类的实例(通过COM).
事实
以下是我尝试从C#.dll创建.NET对象实例的示例.我试图实例化的具体类叫做Employee,为了简单地提出我的问题,实现了IPerson接口:
CSharpProjectName::IPersonPtr pPersonPtr;
HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);
Run Code Online (Sandbox Code Playgroud)
即使我使用"regasm/codebase"注册c#.dll并确认注册表中存在密钥,为什么我会收到"未注册类"错误?
任何帮助将不胜感激.谢谢!
一个客户想要从VB6使用我们的.NET DLL.它们旨在支持反向互操作,所有工作都很好......除了:在两个不同的目录中有两个单独的VB6程序.似乎有必要做一个:
这是客户的观察,也得到了RegAsm文档的支持:
使用Regasm.exe注册程序集后,可以将其安装在全局程序集缓存中,以便可以从任何COM客户端激活它.如果程序集仅由单个应用程序激活,则可以将其放在该应用程序的目录中.
我对这一点感到困惑.
第一点困惑:
据我所知,COM运行时使用Prog ID/Class ID定位DLL.当我在类ID条目的注册表中查看时,我在CodeBase键中看到了.NET DLL的完整路径.为什么使用Prog ID/Class ID的COM程序无法使用CodeBase找到.NET DLL?
第二点困惑:
GAC特定于.NET.它如何参与解析COM引用?
我用C#昨天创建了一个COM对象,导致我的VS 2010项目的bin/release目录中有三个文件(comclass.dll,comclass.pdb和comclass.tlb).现在,当我在项目中构建解决方案时,VS会在开发PC上自动为我注册该类,我可以从Powershell访问COM对象及其方法.但是,当我将这三个文件复制到另一台机器并尝试使用regsvr32注册dll时,它告诉我
模块"comclass.dll"已加载但未找到入口点DllRegisterServer.
确保"comclass.dll"是有效的DLL或OCX文件,然后重试.
使用.tlb文件中regasm的/tlb参数给我一个类似的消息.所以我有点难过.有谁知道我应该怎么从这里开始?