Tengo una aplicación WinForms en la que estoy usando Word Automation para compilar documentos a través de una plantilla y luego guardarlos en la base de datos. Después de crear el documento, recupero el documento de la base de datos, lo escribo en el sistema de archivos en un directorio temporal y luego abro el documento utilizando los servicios de Word Interop.Word Automation: el archivo está en uso por otra aplicación o usuario
Hay una lista de documentos cargados y el usuario puede abrir solo 1 instancia de cada documento, pero puede abrir múltiples documentos diferentes simultáneamente. No tengo ningún problema con la apertura, el ahorro, y el cierre cuando se abren 1 documento, sin embargo, cuando se abren varios documentos al mismo tiempo, me sale el siguiente error al cerrar cualquiera de mis instancias de Word:
The file is in use by another application or user. (C:\...\Templates\Normal.dotm)
This error is commonly encountered when a read lock is set on the file that you are attempting to open.
estoy utilizando el siguiente código para abrir el documento y controlar el evento BeforeDocumentClosed:
public void OpenDocument(string filePath, Protocol protocol, string docTitle, byte[] document)
{
_protocol = protocol;
documentTitle = docTitle;
_path = filePath;
if (!_wordDocuments.ContainsKey(_path))
{
FileUtility.WriteToFileSystem(filePath, document);
Word.Application wordApplication = new Word.Application();
wordApplication.DocumentBeforeClose += WordApplicationDocumentBeforeClose;
wordApplication.Documents.Open(_path);
_wordDocuments.Add(_path, wordApplication);
}
_wordApplication = _wordDocuments[_path];
_currentWordDocument = _wordApplication.ActiveDocument;
ShowWordApplication();
}
public void ShowWordApplication()
{
if (_wordApplication != null)
{
_wordApplication.Visible = true;
_wordApplication.Activate();
_wordApplication.ActiveWindow.SetFocus();
}
}
private void WordApplicationDocumentBeforeClose(Document doc, ref bool cancel)
{
if (!_currentWordDocument.Saved)
{
DialogResult dr = MessageHandler.ShowConfirmationYnc(String.Format(Strings.DocumentNotSavedMsg, _documentTitle), Strings.DocumentNotSavedCaption);
switch (dr)
{
case DialogResult.Yes:
SaveDocument(_path);
break;
case DialogResult.Cancel:
cancel = true;
return;
}
}
try
{
if (_currentWordDocument != null)
_currentWordDocument.Close();
}
finally
{
Cleanup();
}
}
public void Cleanup()
{
if (_currentWordDocument != null)
while(Marshal.ReleaseComObject(_currentWordDocument) > 0);
if (_wordApplication != null)
{
_wordApplication.Quit();
while (Marshal.ReleaseComObject(_wordApplication) > 0);
_wordDocuments.Remove(_path);
}
}
¿alguien ve algo malo que estoy haciendo para permitir la apertura de varios documentos al mismo tiempo? Soy bastante nuevo en Word Automation y en los servicios de Word Interop, por lo que cualquier consejo es apreciado. Gracias.
Cómo se abre directamente el archivo bloqueado en el código (C: \ ... \ Plantillas \ Normal.dotm) o se accede a este de forma automática? Si usted es el que lo abre, en su lugar podría crear una copia o algo así para evitar el bloqueo, o intente acceder a él con solo leerlo. –