IManExt ImportCmd проблема - PullRequest
       57

IManExt ImportCmd проблема

3 голосов
/ 17 декабря 2009

Я писал небольшое приложение на C # для копирования документа в отдельную папку «Мои документы» на нашем сервере DMS.

Я обошел код вокруг списка, представленного в «WorkSite SDK 8: используйте IMANEXT2Lib.IManRefileCmd для создания файла новых папок документов».

Использование этого кода в приложении WinForm У меня нет проблем с копированием файла из исходной папки в папку «Мои документы» DMS пользователя.

Однако, если я использую код в командной строке application / .dll или любого другого типа приложения (кроме WinForm) во время процесса копирования, я получаю сообщения об ошибках;

1

Произошла ошибка при попытке зарегистрировать событие!

IManExt: Произошла ошибка при попытке записать событие!

Доступ запрещен.

2

Документ был импортирован в базу данных, но не может быть добавлен в папка.

IManExt: документ был импортирован в базу данных, но не может быть добавлено в папку.

IManExt.LogRuleEventsCmd.1: Произошла ошибка при попытке записать событие!

IManExt.LogRuleEventsCmd.1: доступ запрещен.

Произошла ошибка при попытке записать событие!

-% -

Кто-нибудь знает, почему я получаю сообщения об ошибке «Отказано в доступе» при использовании не-WinForms-приложения для копирования документов? Что мне нужно сделать, чтобы обойти эту проблему?

Любая помощь будет потрясающей!

Код на месте: </p> <pre><code> 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."); } } } }

1 Ответ

2 голосов
/ 04 февраля 2010

На всякий случай, если это кому-то поможет.

Кажется, моя проблема была результатом проблемы с потоками.

Я заметил, что созданные в C # winform приложения автоматически настроены для работы в одном потоке 'ApartmentState' ([STAThread]).

Принимая во внимание, что состояние консольного приложения и потока библиотеки классов и управление не были определены в проекте и обрабатывались с использованием конфигурации .NET по умолчанию.

Чтобы заставить это работать: в консольном приложении я просто добавил тег [STAThread] в строке над моим вызовом метода Main.

В библиотеке классов я определил поток для функции, ссылающейся на IMANxxx.dll, и установил ApartmentState, например,

Thread t = new Thread(new ThreadStart(PerformSearchAndMove));
t.SetApartmentState(ApartmentState.STA);
t.Start();

В обоих случаях обеспечение единого потока 'ApartmentState' было бы решено.

...