2016-08-02 6 views
0

Я разрабатываю подключаемый модуль для стороннего приложения, которое требует использования System.LicenseProvider.Использование LicenseManager с FlexLM

Файл лицензии сам по себе является сгенерированным 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; } } 
} 

Используя LMTOOLS от Flexera, я могу получить статус сервера лицензий (я бегу на 7507 @mypcname, используется 0 из 1 лицензии для myFlexLMFeature).

Тогда я могу добавить 7507 @ mypcname в дополнительных серверах, которые будут использоваться приложением третьей стороны, но:

  • isLicensed возвращает истинный (ожидаемый)
  • LicenseManager.Validate() не выбрасывает исключение (ожидается)
  • thisLicense равна нулю (не ожидается)

Я пытался использовать

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

но оба имеют схожие результаты (код, кажется, работает, но thisLicense равно нулю)

ли я делаю что-то неправильно? является LicenseManager совместимым с FlexLM? или есть ошибка в стороннем приложении, которое запускает мой подключаемый модуль (каким-то образом не подключается к серверу лицензий должным образом)? Как проверить?

Благодаря

ответ

1

OK, после еще некоторого исследования:

Вы не можете использовать LicFileProvider читать FlexLMFiles

Вы должны создать свой собственный LicenseProvider и реализовать getLicense. Чтобы сделать это, вы должны знать, где находится файл, и использовать lmutil. Итак, сначала вам нужно проверить, доступна ли лицензия.

Вдохновленный из this previous question, я был в состоянии получить следующий код, чтобы проверить, если лицензия действительна или нет (и обнаружить, когда используются несколько лм серверов, которые один к использованию):

//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, но он, похоже, не генерирует токен. Есть ли у вас какие-либо идеи?