0

我正在为需要使用 System.LicenseProvider 的第三方应用程序开发插件。

许可证文件本身是由 FlexLM 生成的。

所以我有:

[LicenseProvider(typeof(LicFileLicenseProvider))]
public class MyLicensedModule
{
    protected System.ComponentModel.License thisLicense;
    protected ModuleFlexFeature thisfeature;

    public bool LicenseCheck()
    {
        bool isLicensed = LicenseManager.IsLicensed(typeof(ModuleFlexFeature)); //returns TRUE
        if(thisFeature==null) thisFeature = new ModuleFlexFeature();
        thisLicense = LicenseManager.Validate(typeof(ModuleFlexFeature),thisFeature);
        //no thrown exception
        return (thisLicense != null); //thisLicense is always null
    }

    public void Dispose()
    {
        if (thisLicense!=null)
        {
            thisLicense.Dispose();
            thisLicense = null;
        }
    }
}

(+其他不相关的方法),使用:

internal class ModuleFlexFeature
{
    public ModuleFlexFeature() { }
    public string FeatureName { get { return "myFlexLMFeature"; } }
    public float FeatureVersion { get { return 2016.0f; } }
}

使用 Flexera 的 LMTOOLS,我可以获得许可证服务器状态(我在 7507@mypcname 上运行,使用了 myFlexLMFeature 的 1 个许可证中的 0 个)。

然后我可以在额外的服务器中添加 7507@mypcname 以供第三方应用程序使用,但是:

  • isLicensed 返回 true(预期)
  • LicenseManager.Validate() 不抛出异常(预期)
  • thisLicense 为空(不是预期的)

我试过用

LicenseManager.IsValid(typeof(ModuleFlexFeature),new ModuleFlexFeature(), out thisLicense);

但两者都有相似的结果(代码似乎有效,但 thisLicense 为空)

我做错什么了吗?LicenseManager 与 FlexLM 兼容吗?或者运行我的插件的第三方应用程序是否存在错误(不知何故无法正确连接到许可证服务器)?如何检查?

谢谢

4

1 回答 1

1

好的,经过更多调查:

您不能使用 LicFileProvider 来读取 FlexLMFiles

您必须创建自己的 LicenseProvider 并实施 getLicense。为此,您必须知道文件在哪里 / 可能在哪里,并使用 lmutil。因此,首先,您需要检查许可证是否可用。

上一个问题的启发,我已经能够获得以下代码来检查许可证是否有效(并检测何时使用多个 lm 服务器,使用哪一个):

//get the potential file candidates
string file = Environment.GetEnvironmentVariable("LM_LICENSE_FILE");
List<string> candidates = new List<string>(file.Split(';'));
foreach (string filecan in candidates)
{
    //read the lm stats for this
    string args = "lmstat -f " + MyFeatureName + " -c " + file;
    ProcessStartInfo info = new ProcessStartInfo(@"lmutil.exe", args);
    Process lmutil = Process.Start(info);
    string output = lmutil.StandardOutput.ReadToEnd();

    //now get the line
    string matchPattern = @"Users of (\w+):.*Total of (\d+) license.*Total of (\d+) license";
    MatchCollection matches = Regex.Matches(output, matchPattern);
    foreach(Match m in matches)
    {
        //are only returned: m.Succes = true and m.Groups[1].Value = MyFeatureName
        int value;
        int total = Int32.TryParse(m.Groups[2].Value, out value) ? value : 0;
        int used = Int32.TryParse(m.Groups[3].Value, out value) ? value : 0;
        if (total - used > 0) return true;
    }
}
return false;

这工作正常......但这不会生成许可证(这只检查我是否可以合理地希望获得许可证)。

我调查了 lmborrow 但它似乎也没有生成令牌。你有什么主意吗?

于 2016-08-09T19:59:06.890 回答