2016-08-02 15 views
0

Ich entwickle ein Plug-in für eine Anwendung von Drittanbietern, die die Verwendung eines System.LicenseProvider erfordert.Verwendung von LicenseManager mit FlexLM

Die Lizenzdatei selbst wird von FlexLM generiert.

so habe ich:

[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; 
     } 
    } 
} 

(+ andere irrelevante Methoden), mit:

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

die LMTOOLS Verwendung von Flexera kann ich die Lizenz-Server-Status (ich auf 7507 leite @mypcname, 0 von 1 Lizenz für myFlexLMFeature wird verwendet).

Dann kann ich 7507 @ mypcname in den zusätzlichen Server hinzufügen, die vom Dritten App verwendet werden, aber:

  • isLicensed liefert true (erwartete)
  • LicenseManager.Validate() wirft keine Ausnahme (erwartet)
  • dieser Lizenz ist null (nicht erwartet)

ich habe versucht

zu verwenden

aber beide haben ähnliche Ergebnisse (Code scheint zu funktionieren, aber diese Lizenz ist null)

Bin ich etwas falsch gemacht? Ist LicenseManager kompatibel mit FlexLM? Oder gibt es einen Fehler in der Drittanbieter-App, auf der mein Plug-in läuft (stellt irgendwie keine Verbindung zum Lizenzserver her)? Wie zu überprüfen?

Dank

Antwort

1

OK, Nach einiger mehr Untersuchung:

Sie können keine LicFileProvider verwenden FlexLMFiles

Sie müssen erstellen Sie Ihre eigenen License und implementieren getLicense zu lesen. Um dies zu tun, müssen Sie wissen, wo die Datei ist/sein kann, und verwenden Sie lmutil. Zuerst müssen Sie prüfen, ob eine Lizenz verfügbar ist.

von this previous question inspiriert, konnte ich den folgenden Code erhalten, zu überprüfen, ob eine Lizenz gültig ist oder nicht (und erkennen, wenn mehrere lm-Server verwendet werden, die man verwenden):

//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; 

Das funktioniert gut ... ABER das macht nicht eine Lizenz generieren (das prüft nur, ob ich vernünftigerweise auf einen oder nicht hoffen kann).

Ich habe lmborrow untersucht, aber es scheint auch kein Token zu generieren. Hast du irgendeine Idee?