Tip: Windows Phone - 匿名类型和 MethodAccessException

一个wp7应用引用了Facebook csharp sdk的dll, 传给FacebookClient的方法中使用了一个匿名类型,结果抛出MethodAccessException

使用匿名类型:
fb.PostAsync("oauth/access_token",new
{
client_id=AppId,
client_secret=AppSecret,
redirect_uri=RedirectUri,
code=oauthResult.Code
});
异常代码:

foreach(varpropertyInfoinparameters.GetType().GetProperties())
{
if(!propertyInfo.CanRead)continue;
dictionary[propertyInfo.Name]=propertyInfo.GetValue(parameters,null);
}

异常原因: 匿名类型被编译为internal成员,跨程序集访问时会遇到此异常。

解决办法:可在使用匿名类型的程序集AssemblyInfo.cs中使用如下特性:

//makeanonymoustypeinthisassemblycanbeaccessiblebyFacebook.dll
[assembly:InternalsVisibleTo("Facebook")]

参考:

http://stackoverflow.com/questions/8273399/anonymous-types-and-get-accessors-on-wp7-1

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx


<think>嗯,用户提供的这段C#代码编译不通过,我需要找出问题所在。首先,用户之前询问过C#调用PnP Core SDK的问题,现在这段代码看起来是使用旧的ClientContext方式操作SharePoint,而不是PnP Core SDK。可能用户是想迁移到新SDK,或者在使用旧代码时遇到了问题。 首先,检查代码结构。ClientContext属于旧的CSOM(Client Side Object Model),而PnP Core SDK是更现代的库,两者不兼容。用户可能在混合使用两者,或者环境配置有问题。 代码中使用了SharePointOnlineCredentials,这需要Microsoft.SharePoint.Client.RuntimeMicrosoft.SharePoint.Client.CSOM的NuGet包。如果项目中没有安装这些包,肯定会编译失败。用户可能没有安装正确的包,或者版本不兼容。 接下来,看看具体错误。比如,SecureString的处理,现在可能不推荐使用,或者需要特定的命名空间。还有SPUrlUtility.CombineUrl,这个类可能在新版本中已被弃用或移动到了其他命名空间。 EnsureFolder方法可能在旧CSOM中不存在,或者需要扩展方法。用户可能在调用web.EnsureFolder时出错,因为旧版CSOM可能需要使用FolderCollection.Add方法手动创建文件夹。 FileCreationInformation属于Microsoft.SharePoint.Client,如果缺少引用,也会导致编译错误。另外,路径处理可能有问题,比如使用Path.GetFileName,而SharePoint路径应该用Server Relative URL。 用户可能没有添加必要的using指令,比如Microsoft.SharePoint.Client、Microsoft.SharePoint.Client.Utilities等。此外,异步操作可能需要使用ExecuteQueryAsync,但用户代码中用了同步的ExecuteQuery,这可能在当前上下文中不可用。 综合来看,用户的问题可能涉及缺少NuGet包、过时的方法或类、命名空间引用问题,以及异步调用处理。需要逐一检查这些点,并给出解决方案,比如安装正确的包,替换过时的方法,添加必要的using语句,以及调整代码结构。此外,建议用户迁移到PnP Core SDK,以获得更好的支持功能。</think>你提供的代码基于 **旧的 SharePoint 客户端对象模型(CSOM)**,存在以下几个关键问题导致编译失败。以下是具体分析修复方法: --- ### **一、编译错误原因** #### 1. **缺少 NuGet 包依赖** - **错误表现**:`ClientContext`、`SharePointOnlineCredentials` 等类型未找到。 - **修复方法**:安装必要的 NuGet 包: ```bash Install-Package Microsoft.SharePoint.CSOM Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory ``` #### 2. **命名空间缺失** - **错误表现**:`SPUrlUtility`、`Folder` 等类型未定义。 - **修复方法**:添加以下 `using` 指令: ```csharp using Microsoft.SharePoint.Client; using Microsoft.SharePoint.Client.Utilities; ``` #### 3. **过时的 API 调用** - **错误点**:`web.EnsureFolder` 方法已弃用。 - **修复代码**:改用 `CreateFolder` 方法: ```csharp Folder spFolder = web.Folders.Create(targetPath); ``` #### 4. **路径处理问题** - **错误点**:`SPUrlUtility.CombineUrl` 参数顺序错误。 - **修复代码**:调整参数顺序: ```csharp SPUrlUtility.CombineUrl(libraryRelativePath, folder) ``` --- ### **二、修复后的完整代码** ```csharp using Microsoft.SharePoint.Client; using Microsoft.SharePoint.Client.Utilities; using System.IO; using System.Security; // 添加必要的命名空间 NuGet 包后 using (ClientContext clientContext = new ClientContext(webUrl)) { // 安全凭据 var securePwd = new SecureString(); foreach (char c in pwd) securePwd.AppendChar(c); clientContext.Credentials = new SharePointOnlineCredentials(email, securePwd); Web web = clientContext.Web; clientContext.Load(web); clientContext.ExecuteQuery(); List library = web.Lists.GetByTitle(listName); clientContext.Load(library.RootFolder); clientContext.ExecuteQuery(); string libraryRelativePath = library.RootFolder.ServerRelativeUrl; using (FileStream stream = new FileStream(files, FileMode.Open)) { string targetPath = string.IsNullOrEmpty(folder) ? libraryRelativePath : SPUrlUtility.CombineUrl(libraryRelativePath, folder); // 自动创建目录(修正过时方法) if (!string.IsNullOrEmpty(folder)) { Folder spFolder = web.Folders.Create(targetPath); clientContext.Load(spFolder); clientContext.ExecuteQuery(); } // 上传文件 var fileCreationInfo = new FileCreationInformation { ContentStream = stream, Url = Path.GetFileName(files), Overwrite = true }; Folder uploadFolder = web.GetFolderByServerRelativeUrl(targetPath); Microsoft.SharePoint.Client.File newFile = uploadFolder.Files.Add(fileCreationInfo); clientContext.ExecuteQuery(); } } ``` --- ### **三、关键注意事项** 1. **NuGet 包版本**: - 确保 `Microsoft.SharePoint.CSOM` 版本 ≥ 16.1.23810.12000(支持 .NET Framework 4.6.2+ 或 .NET Core 3.1+)。 2. **异步操作建议**: - 旧版 CSOM 推荐同步调用(`ExecuteQuery`),但新版建议改用异步: ```csharp await clientContext.ExecuteQueryAsync(); ``` 3. **PnP Core SDK 替代方案**(推荐): - 旧 CSOM 代码迁移到 PnP Core SDK 可简化逻辑: ```csharp var file = await context.Web.GetFolderByServerRelativeUrlAsync(targetPath) .UploadFileAsync(Path.GetFileName(files), stream, overwrite: true); ``` --- ### **四、常见错误排查** | 错误类型 | 解决方案 | |--------------------------|-------------------------------------| | `TypeNotFound` | 检查 NuGet 包 `using` 命名空间 | | `MethodAccessException` | 确认 `EnsureFolder` 替换为 `Create` | | `InvalidUrlException` | 使用 `SPUrlUtility.CombineUrl` 拼接路径 | 建议参考 [Microsoft 官方文档](https://docs.microsoft.com/zh-cn/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-client-library-code) 获取更多示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值