我的VSTO Outlook插件突然停止在一台客户机器上工作(它没有加载,没有错误消息)而且我遇到了故障排除问题.该机器是Windows 7 x86,Outlook 2007.该加载项是使用Visual Studio 2008编写的,并使用VSTO 2005和2003 PIA(因为我们还需要支持Outlook 2003).它在其他机器上完美运行.
这是我试图获得有用的故障排除输出:
VSTO_SUPPRESSDISPLAYALERTS
环境变量(设置为0
).没有.加载项不会在没有给出任何原因指示的情况下加载.我还检查了"通常的嫌疑人"(CAS政策,安装的PIA,注册表中的LoadBehavior,重新安装VSTO和加载项).
其他一些观察:
LoadBehavior
在注册表中停留在3
.Trace.WriteLine
代码的最顶部(ThisAddIn_Startup
处理程序中的第一行)有一条消息,未到达(我使用DebugView检查).因此,不加载的原因不是我的加载项中的例外,而是VSTO加载加载项或Outlook加载VSTO失败.而不是更随机的调试("试试这个......","试试......"),我真的想强迫Outlook和/或VSTO告诉我什么是错的,即给我一个有用的错误信息而不是只是无所事事试图启用加载项时.有任何想法吗?
我有一个Outlook 2013和2016 VSTO加载项项目,我试图描述一个WPF用户控件添加到自定义任务窗格这里.
我遇到的问题是,当我添加用户控件(WPF)时,它会生成一个带网格的WPF控件,但会自动抛出"类型'UserControl'不支持直接内容"的错误.
WPF生成:
<UserControl x:Class="TestNamespace.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TestNamespace"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我知道在过去我不得不将WPF项目类型的guid添加到.proj文件中以使一些工作正常工作,但添加它没有任何区别(实际上它甚至不会按特定顺序加载).
原版的:
<ProjectTypeGuids>{BAA0C2D2-18E2-41B9-852F-F413020CAA33};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
Run Code Online (Sandbox Code Playgroud)
崩溃:
<ProjectTypeGuids>{BAA0C2D2-18E2-41B9-852F-F413020CAA33};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
Run Code Online (Sandbox Code Playgroud)
不崩溃,但不修复错误:
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{BAA0C2D2-18E2-41B9-852F-F413020CAA33};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
Run Code Online (Sandbox Code Playgroud)
谁能指出我正确的方向?
UPDATE
我尝试直接创建一个新的类库项目,添加了一个WPF用户控件,然后添加了对System.Xaml的引用,我有同样的问题.
从Visual Studio RC开始,Visual Studio 2015似乎不再支持Visual Studio Tools for Office(VSTO)中的Office加载项项目类型.很多googlin'和MS博客中的PM问题都没有发现有用的信息; 但也许社区中的其他人都知道更多.打开VSTO项目会产生"(不兼容)".所以:
我已经没有2013了,因为我擦了那台机器......
我有一个用C#编写的Outlook添加.
我想知道如何获得当前用户的电子邮件地址?
谢谢
我开发了一个Outlook VSTO插件.某些任务应该在后台线程上完成.通常,检查本地数据库中的某些内容或调用Web请求.阅读了几篇文章之后,我放弃了在后台线程中调用Outlook对象模型(OOM)的想法.
我有一些wpf控件,我成功地设法使用.NET 40 TPL执行异步任务,并在完成时"完成"主VSTA线程中的作业(即访问UI或OOM).
为此,我使用了以下形式的语法:
Task<SomeResult> task = Task.Factory.StartNew(()=>{
//Do long tasks that have nothing to do with UI or OOM
return SomeResult();
});
//now I need to access the OOM
task.ContinueWith((Task<SomeResult> tsk) =>{
//Do something clever using SomeResult that uses the OOM
},TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但现在我想在OOM中挂钩没有Form/WPF控件的事件时做类似的事情.确切地说,我的问题来自于TaskScheduler.FromCurrentSynchronizationContext()抛出异常的事实.
例如,
Items inboxItems = ...;
inboxItems.ItemAdd += AddNewInboxItems;
private void AddNewInboxItems(object item)
{
Task<SomeResult> task = Task.Factory.StartNew(()=>{
//Do long tasks that have nothing to do with OOM
return SomeResult()});
var scheduler = …
Run Code Online (Sandbox Code Playgroud) 我遵循了本教程,但是当我构建然后在visual studio中运行我的项目时,不会出现功能区选项卡.如果有帮助的话,我正在使用outlook 2010.
使用新的Outlook VSTO C#项目创建的ThisAddIn类具有一个Application
属性,您可以使用该属性访问Outlook文件夹和项目.问题是当你在ThisAddIn类中时可以轻松使用它,但是从项目中的其他类中无法轻松访问它.这是因为它是一个实例属性.
我想找到这个属性在我的其他类中提供相同功能的最佳方式,所以我想出了两个可能的解决方案,但我不知道它们中的哪一个(如果有的话)是好的.
让我们假设我想获取默认的收件箱文件夹.在ThisAddIn类里面我会做这样的事情:
this.Application.Session.GetDefaultFolder(Outlook.olFolderInbox);
Run Code Online (Sandbox Code Playgroud)
现在如何在这堂课外做同样的事情?
首先,我可以向ThisAddIn
类添加一个静态属性,并将其设置为我想在其他类中公开的值.
public partial class ThisAddIn
{
public Outlook.Application OutlookApp;
void ThisAddIn_Startup(object sender, EventArgs e)
{
// init static variable value here
OutlookApp = this.Application
// initialize the rest of addin here
}
void InternalStartup()
{
this.Startup += this.ThisAddIn_Startup;
}
}
Run Code Online (Sandbox Code Playgroud)
这样在我的任何其他类中我都可以这样做:
ThisAddIn.OutlookApp.Session.GetDefaultFolder(Outlook.olFolderInbox);
Run Code Online (Sandbox Code Playgroud)
我可以做的第二件事是在我使用它之前在我的其他类中初始化Application对象.但我不确定创建该类型的新对象是否不会创建Outlook的新实例.
class MyOtherClass
{
public void MyMethod()
{
var app = new Outlook.Application();
var folder = app.Session.GetDefaultFolder(Outlook.olFolderInbox);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人有任何建议哪种方法更好,如果你对这个问题有不同的解决方案,我也会对此表示赞同.
我为Outlook写了一段时间,在outlook消息中添加/删除签名下面的可选标语.此加载项无任何问题.
我正在编写第二个加载项,需要在下面添加信息(无论是否存在可选签名),并再次引用Word编辑器中的_MailAutoSig书签.我遇到的问题是这个书签似乎不再出现,我的其他加载项的书签也没有出现.
下面两段代码中的一个区别是第一个代码是从ItemSend传递的对象转换的MailItem,而第二个代码是在ItemSend事件之前处理的.
这是我目前正在编写的代码:
Word.Document toMsg = msg.GetInspector.WordEditor as Word.Document;
foreach (Word.Bookmark b in toMsg.Bookmarks)
Debug.Print(b.ToString());
Word.Range r_toMsg;
try
{
string oBookmark = "_MailAutoSig"; // Outlook internal bookmark for location of the e-mail signature`
object oBookmarkObj = oBookmark;
if (toMsg.Bookmarks.Exists(oBookmark) == true)
Debug.Print("sigbookmark");
r_toMsg = toMsg.Bookmarks.get_Item(ref oBookmarkObj).Range;
}
catch
{
string oOffsiteBookmark = "OffsiteBookmark";
object oOffsiteBookmarkObj = oOffsiteBookmark;
if (toMsg.Bookmarks.Exists(oOffsiteBookmark) == true) // if the custom bookmark exists, remove it
Debug.Print("offsite bookmark");
}
finally
{
r_toMsg = toMsg.Range(missing,missing);
}
Run Code Online (Sandbox Code Playgroud)
这是来自我的工作加载项的代码: …
我正在使用c#和Microsoft.Interop库编写办公室插件.当我通过将Cancel属性设置为false取消在Item_Open事件中打开约会时,它会导致Outlook与Appcrash崩溃.当与与会者开始定期重复播放系列时,会发生崩溃.
这在2016年有点新.在2010年和2013年它曾经工作过.
有谁知道如何让这个在2016年工作?
我试图在我的代码中找出问题,但是即使我在AppointmentItem打开事件中将cancel设置为true,即使是这里找到的示例(其他方面也适用于2016)也会中断.
编辑:我发现只有在禁用缓存模式时才会发生这种情况
编辑2:我刚刚发现这只发生在2016年的2019年和o365(自动更新到2019年)它似乎再次起作用.
outlook-addin ×10
c# ×7
vsto ×6
.net ×4
outlook ×3
add-in ×1
ms-word ×1
office-2007 ×1
outlook-2016 ×1
ribbon ×1
wpf ×1
xaml ×1