2

我有一个 dll,它与我的应用程序的初始安装一起安装(通过 msi 文件)。该 dll 包含一个用户密钥,这是初始安装的“演示”。当用户购买许可证时,他会获得另一个包含其姓名的 dll。第二个 dll 只是第一个,用不同的名称重新构建,因此它是相同的 GUID 和文件名。这在我的 win7 测试机上运行良好,我可以替换我的应用程序目录中的 dll 并且它运行正常。我最近向新客户端提供了一个用户 dll,但替换方法似乎不起作用。他非常懂 IT,所以我认为他正在按照电子邮件中的说明进行操作(将您的应用程序目录中的 userdata.dll 替换为附件),它似乎并没有更改 dll。他正在使用Win8(专业版)。

我曾想过向他发送一个 Inno 设置以将用户 dll 复制到应用程序目录 Flags:ignorereversion regserver sharedfile

任何人都可以提出解决方案或解释吗?

稍后...我现在向他发送了更新的 dll 的 Inno 设置,这很有效。如果我使用第二种 dll 方法(一个好主意),我仍然需要让用户安装它。

4

2 回答 2

2

与其替换原来的 .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;
}
于 2013-03-20T20:25:38.730 回答
0

你说它似乎没有替换 DLL。是 UAC 将他的文件副本重定向到本地存储吗?

如果是这种情况,那么处理它的最简单方法是
1) 提供一个可以执行文件复制的批处理文件,以及通过右键单击该批处理文件并选择“以管理员身份运行”来启动该批处理文件的说明.
2)提供一个可执行文件复制。您可以像批处理文件一样包含以管理员身份运行 exe 的说明,也可以在应用程序中包含清单以指示文件需要以管理员身份执行的窗口。

最后一个可能值得进行故障排除的选项是让用户关闭 UAC 并再次尝试文件复制。如果可行,那么该用户会很高兴,并且您知道问题所在,并且可以为未来的客户找到一个优雅的解决方案。

我刚刚查看了我的 Win 8 笔记本电脑,UAC 的选项位于控制面板 - 用户帐户 - 用户帐户 - 更改用户帐户控制设置。这将提供一个滑块,该滑块可以一直滑到底部以关闭 UAC。
(用户帐户确实列出了两次。)

于 2013-03-20T20:54:41.810 回答