最近,我在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位环境中使用?
手动注册COM Interop的托管类时,需要某些注册表项.例如
HKEY_CLASSES_ROOT
CLSID\[My Cls Id]
InprocServer32
(Default) = "mscoree.dll"
Assembly = [My assembly name]
etc.
Run Code Online (Sandbox Code Playgroud)
我注意到当VS为COM Interop注册一个库时,它还会添加一个键
HKEY_CLASSES_ROOT
CLSID\[My Cls Id]
Implemented Categories
{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}
Run Code Online (Sandbox Code Playgroud)
这个关键是什么,是否绝对必要?据我所知,如果没有它,生活就会好起来,但也许我没有遇到需要它的情况.