У меня есть проект надстройки для Excel. Он отлично работает на моем компьютере. Но когда я устанавливаю его на клиентский компьютер, он выдает мне сообщение об ошибке, о котором я упоминал.
- Я опубликовал его, используя project-> properties-> publish.
- У меня установлен флажок "Включить только мой код".
- Я снял отметки для «брошенных» и «необработанных пользователем» для исключения «файл не найден»
- Я устанавливаю проект на клиенте с помощью файла «setup» в папке «publish» в папке моего проекта.
При публикации-> предварительные условия у меня отмечены следующие пункты:
.net framework sp1
Microsoft .net Framework 4
Основные сборки взаимодействия Microsoft Office 2007
Инструменты Microsoft Visual Studio 2010 для работы в офисе
Установщик Windows 4.5
Я использую JSON. это код для моего класса:
[Serializable]
[JsonObject(MemberSerialization.OptIn)]
public class documentSchemaRestInfo
{
[System.Runtime.Serialization.DataMember]
[JsonProperty]
public double id { get; set; }
[System.Runtime.Serialization.DataMember]
[JsonProperty]
public string name { get; set; }
[System.Runtime.Serialization.DataMember]
[JsonProperty]
public string description { get; set; }
[System.Runtime.Serialization.DataMember]
[JsonProperty]
public string[] fields { get; set; }
}
// ********************************************* ***************
Код, который использует класс:
public List<DocumentField> getSchemaOfGroup(documentGroupPk groupPK)
{
List<DocumentField> result = new List<DocumentField>();
HttpWebRequest request = (HttpWebRequest)WebRequest.
Create(ProxyFactory.baseAddress+"/services/rest/group/"
+ groupPK.id + "/schema");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
string responseBody = streamReader.ReadToEnd();
dynamic ds = ((dynamic)JsonConvert.DeserializeObject(responseBody))
.documentSchemaRestInfo;
foreach (dynamic f in ds.fields)
{
result.Add(new DocumentField(
f.name.ToString(),f.internalName.ToString(),false));
}
return result;
}
На клиентском компьютере установлен Excel 2010.
Это строка кода, выдающая исключение:
excelApp = (Excel.Application)
System.Runtime.InteropServices.Marshal.GetActiveObject
("Excel.Application");
Что странно в том, что это работает, когда я выполняю следующие шаги:
Запустите его на клиенте и получите исключение.
Запустите его на моем собственном ПК (где исключение не происходит).
Нажмите кнопку надстройки на ленте Excel, которую я сделал, в приложении на клиентском компьютере.
И в этот раз я не получу никаких исключений !!
Я проверял это так много раз. Каждый раз, когда я следую этому порядку, он отлично работает!
11.
Заранее большое спасибо.
Edit:
12. Мое приложение работает так:
Когда пользователь нажимает на мою кнопку на ленте в первый раз, появляется форма входа в систему,
и если он авторизован, появится форма, которую он запросил.
В следующий раз появляется только запрошенная форма.
и исключение происходит ТОЛЬКО при первом клике.
вот мой код для этого:
(Никаких исключений не возникает в последней строке,
но дело не в случае с 7-й строкой)
1.//If there is no ticket, means we haven't had a successfull login yet.=>
2.// We should show the login form instead of groups form.
3.if (string.IsNullOrEmpty(ProxyFactory.ticket))
4.{
5. okOrCancel = new LoginForm().ShowDialog();
6. if (okOrCancel == DialogResult.OK)
7. new GroupsForm().ShowDialog();
8.}
9.//If the is a ticket, means we have had a successful login.
10.else
11. new GroupsForm().ShowDialog();