IManExt ImportCmd ennuis
Question
Je suis en train d'écrire une petite application en C # pour copier un document dans un dossier de personnes Mes documents sur notre serveur de DMS.
J'ai beased le code dans la liste fournie dans le. 'WorkSite SDK 8: Utiliser le IMANEXT2Lib.IManRefileCmd dans un fichier nouveau document Dossiers de blog
En utilisant ce code dans une application WinForm Je n'ai aucun problème de copier le fichier à partir du dossier source dans le dossier des utilisateurs DMS 'Mes documents de.
Cependant, si j'utilise le code dans une application ligne de commande / dll ou tout autre type d'application (autre que WinForm) pendant le processus de copie je recevoir les messages d'erreur;
1.
Une erreur est survenue lorsque vous essayez d'enregistrer l'événement!
IManExt: Une erreur est survenue lorsque vous essayez d'enregistrer l'événement
L'accès est refusé.
2.
Le document a été importé dans la base de données, mais n'a pas pu être ajouté à le dossier.
IManExt: Le document a été importé dans la base de données, mais ne pouvait pas être ajouté au dossier.
IManExt.LogRuleEventsCmd.1: Une erreur est survenue lorsque vous essayez d'enregistrer l'événement
IManExt.LogRuleEventsCmd.1. L'accès est refusé
Une erreur est survenue lorsque vous essayez d'enregistrer l'événement!
-% -
Quelqu'un sait pourquoi je recevoir le « Accès refusé » des messages d'erreur lors de l'utilisation d'une application non-WinForms pour copier des documents? Qu'est-ce que je dois faire pour contourner ce problème?
Toute aide serait incroyable!
code à la place:
public void moveToDMS(String servName, String dBName, String foldName)
{
const string SERVERNAME = servName; //Server name
const string DATABASENAME = dBName; //Database name
const string FOLDERNAME = foldName; //Matter alias of workspace
IManDMS dms = new ManDMSClass();
IManSession sess = dms.Sessions.Add(SERVERNAME);
sess.TrustedLogin();
//Get destination database.
IManDatabase db = sess.Databases.ItemByName(DATABASENAME);
//Get destination folder by folder and owner name.
IManFolderSearchParameters fparms = dms.CreateFolderSearchParameters();
fparms.Add(imFolderAttributeID.imFolderOwner, sess.UserID);
fparms.Add(imFolderAttributeID.imFolderName, FOLDERNAME);
//Build a database list in which to search.
ManStrings dblist = new ManStringsClass();
dblist.Add(db.Name);
IManFolders results = sess.WorkArea.SearchFolders(dblist, fparms);
if (results.Empty == true)
{
//No results returned based on the search criteria.
Console.WriteLine("NO RESULTS FOUND!");
}
IManDocumentFolder fldr = null;
if (results.Empty == false)
{
//Assuming there is only one workspace returned from the results.
fldr = (IManDocumentFolder)results.ItemByIndex(1);
}
if (fldr != null)
{
// Import file path
string docPath = @"C:\Temp\";
string docName = "MyWord.doc";
// Create an instance of the ContextItems Collection Object.
ContextItems context = new ContextItemsClass();
// Invoke ImportCmd to import a new document to WorkSite database.
ImportCmd impCmd = new ImportCmdClass();
// The WorkSite object you pass in can be a database, session, or folder.
// Depends on in where you want the imported doc to be stored.
context.Add("IManDestinationObject", fldr); //The destination folder.
// Filename set here is used for easy example, a string variable is normally used here
context.Add("IManExt.Import.FileName", docPath + docName);
// Document Author
context.Add("IManExt.Import.DocAuthor", sess.UserID); //Example of a application type.
// Document Class
context.Add("IManExt.Import.DocClass", "BLANK"); //Example of a document class.
//context.Add("IManExt.Import.DocClass", "DOC"); //Example of a document class.
// Document Description (optional)
context.Add("IManExt.Import.DocDescription", docName); //Using file path as example of a description.
// Skip UI
context.Add("IManExt.NewProfile.ProfileNoUI", true);
impCmd.Initialize(context);
impCmd.Update();
if (impCmd.Status == (int)CommandStatus.nrActiveCommand)
{
impCmd.Execute();
bool brefresh = (bool)context.Item("IManExt.Refresh");
if (brefresh == true)
{
//Succeeded in importing a document to WorkSite
IManDocument doc = (IManDocument)context.Item("ImportedDocument");
//Succeeded in filing the new folder under the folder.
Console.WriteLine("New document number, " + doc.Number + ", is successfully filed to " + fldr.Name + " folder.");
}
}
}
}
La solution
Juste au cas où cela aide quelqu'un d'autre.
Il semble que mon problème a été le résultat d'un problème de filetage.
J'ai remarqué les applications C # Winform j'avais créés ont été mis automatiquement pour fonctionner sur un seul thread 'de ApartmentState
' (de [STAThread]
).
considérant que l'état de fil bibliothèque d'applications de la console et de la classe et la gestion n'avaient pas été définis dans le projet et a été manipulé avec la configuration par défaut .NET.
Pour obtenir ce travail. Dans l'application de la console, je viens d'ajouter la balise [STAThread]
sur la ligne au-dessus de mon appel de méthode principale
Dans la bibliothèque de classes, I définie un filetage pour la fonction faisant référence à la IMANxxx.dll
et mis ApartmentState par exemple.
Thread t = new Thread(new ThreadStart(PerformSearchAndMove));
t.SetApartmentState(ApartmentState.STA);
t.Start();
Dans les deux cas assurant seul thread « de ApartmentState
» a été mis en œuvre ensemble résoudrait le problème.