我有一个dll,它安装了我的应用程序的初始安装(通过msi文件)。该DLL包含一个用户密钥,这是初始安装的“演示”。当用户购买许可证时,他将获得另一个包含其姓名的dll。第二个dll只是第一个,使用不同的名称重建,因此它是相同的GUID和文件名。 这在我的win7测试机上工作正常,我可以替换我的应用程序目录中的DLL并且它正确运行。我最近为新客户端提供了一个用户dll,但替换方法似乎不起作用。他非常懂IT,所以我认为他正在关注电子邮件说明(用你附带的app目录替换userdata.dll)它似乎没有改变dll。他正在使用Win8(专业版)。
我曾想过给他发送一个Inno设置来将用户dll复制到app dir中,Flags:ignorereversion regserver sharedfile
有人可以提出解决方案或解释吗?
...后来 我现在已经给他发了一个更新的dll的Inno设置,这个工作。如果我使用第二个dll方法(一个好主意),我仍然需要让用户安装它。
答案 0 :(得分:2)
为什么不提供客户特定信息的 second .dll,而不是替换原始.dll?第二个.dll将解锁原始.dll中的功能。
例如,在原始.dll中,您可以检查Customer.dll
:
if(TryLoadAssembly("Customer.dll", out assembly)) {
if(Validate(assembly)){
IsUnlocked = true;
}
}
进一步的建议(和未经测试的样本) - 让Customer.dll包含一个实现接口的对象:
class Customer : IToken {
GUID Guid {get;}
// other fields
}
验证:
bool Validate(Assembly assembly){
Type type = assembly.GetType("Customer");
IToken customerToken = (IToken)Activator.CreateInstance(type);
// check some properties
return customerToken.Guid == application.Guid;
}
答案 1 :(得分:0)
你说它似乎没有替换DLL。它是否将UAC重定向到本地存储?
如果是这种情况,那么处理它的最简单方法就是要么
1)提供可以进行文件复制的批处理文件,以及通过右键单击并选择“以管理员身份运行”来启动批处理文件的说明。
2)提供可执行文件复制的可执行文件。您可以包含以管理员身份运行exe的说明(如批处理文件),也可以在应用程序中包含清单,以指示文件需要以管理员身份执行的窗口。
最后一个选项,可能值得进行故障排除,是让用户关闭UAC并再次尝试文件复制。如果可以,那么这个用户会很高兴,你知道问题是什么,并为未来的客户找到一个优雅的解决方案。
我刚看了我的Win 8笔记本电脑,UAC选项在控制面板 - 用户帐户 - 用户帐户 - 更改用户帐户控制设置。这将提供一个滑块,可以一直滑到底部以关闭UAC (用户帐户确实列出了两次。)