3

私は、C# を使用して、DMS サーバー上の個々の「マイ ドキュメント」フォルダーにドキュメントをコピーする小さなアプリケーションを作成しています。

「WorkSite SDK 8: IMANEXT2Lib.IManRefileCmd を使用して新しいドキュメント フォルダーをファイルする」ブログで提供されているリストの周りのコードを修正しました。

WinForm アプリケーションでこのコードを使用すると、ファイルをソース フォルダーからユーザーの DMS 'My Documents' フォルダーに問題なくコピーできます。

ただし、コピー プロセス中にコマンド ライン アプリケーション/.dll またはその他の種類のアプリケーション (WinForm 以外) でコードを使用すると、エラー メッセージが表示されます。

1.

イベントをログに記録しようとするとエラーが発生しました!

IManExt: イベントをログに記録しようとするとエラーが発生しました!

アクセスが拒否されました。

2.

ドキュメントはデータベースにインポートされましたが、フォルダに追加できませんでした。

IManExt: ドキュメントはデータベースにインポートされましたが、フォルダーに追加できませんでした。

IManExt.LogRuleEventsCmd.1: イベントをログに記録しようとするとエラーが発生しました!

IManExt.LogRuleEventsCmd.1: アクセスが拒否されました。

イベントをログに記録しようとするとエラーが発生しました!

-%-

WinForms 以外のアプリケーションを使用してドキュメントをコピーすると、「アクセスが拒否されました」というエラー メッセージが表示される理由を知っている人はいますか? この問題を回避するにはどうすればよいですか?

どんな助けでも素晴らしいでしょう!

コードの配置:

    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.");
                }

            }


        }

    }

4

1 に答える 1

2

これが他の誰かを助ける場合に備えて。

私の問題は、スレッドの問題の結果だったようです。

私が作成した C# winform アプリが、単一の ' ApartmentState' スレッド ( [STAThread]) で実行されるように自動的に設定されていることに気付きました。

一方、コンソール アプリケーションとクラス ライブラリ スレッドの状態と管理はプロジェクト内で定義されておらず、既定の .NET 構成で処理されていました。

これを機能させるには: コンソール アプリケーションで[STAThread]、Main メソッド呼び出しの上の行にタグを追加しました。

クラス ライブラリで、ApartmentState を参照する関数のスレッドを定義し、IMANxxx.dllApartmentState を設定しました。

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

どちらの場合も、単一の ' ApartmentState' スレッド セットが実装されていることを確認すると、問題が解決します。

于 2010-02-04T12:52:39.507 に答える