| CARVIEW |
Select Language
HTTP/2 200
date: Wed, 31 Dec 2025 18:05:58 GMT
content-type: text/html; charset=utf-8
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
etag: W/"4b0a931e7613fd260536280f39007284"
cache-control: max-age=0, private, must-revalidate
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: no-referrer-when-downgrade
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=M5aOAghuxX80bMQjGYHTnHmVTFodARIKPvXmQ5neFzilIR3RNzHB5W1mP%2BPeBk9sNfmqSwBbd6CkuvzsUAGOMIiL5KsVoznDoB4bSgtsLHGI2XWVE9SKbpSafNqRs2AAI6V3crLUM1tYkrB5nNgJmtCgYKVgMPUjDahus8Kf1mM40qPi1KjDJiRGIkUwYp8jAsFqYtKs16G3d41yWkufG%2B90PTqISLSzz1yC0A6xdSq2mg%2BlEMNf9b%2Bj%2FG5FAoVQuC%2FKRTpOLnsmGxv4OwboAQ%3D%3D--K2RM5YkidxkxO5MY--nJVkT5ZpbWWlRxryVx5wiw%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.634995825.1767204358; Path=/; Domain=github.com; Expires=Thu, 31 Dec 2026 18:05:58 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 31 Dec 2026 18:05:58 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: D122:1BC34B:80BDC1:8FE263:69556606
Working with attachments · ical-org/ical.net Wiki · GitHub
Skip to content
Navigation Menu
{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 248
Working with attachments
axunonb edited this page Jun 14, 2025
·
6 revisions
RFC 5545 allows for attachments on several calendar components.
| RFC 5445 | iCal.NET |
|---|---|
| VALARM | Alarm |
| VEVENT | CalendarEvent |
| VTODO | Todo |
| VJOURNAL | Journal |
Attachments come in two forms:
-
Uris pointing to some network-accessible resource - Base64-encoded strings that can represent anything
iCal.NET can serialize any URI that System.Uri can understand: HTTP, email addresses, LDAP URLs, local filesystem paths, UNC paths, etc.
var attachment = new Attachment(new Uri("ldap://example.com:3333/o=eExample Industries,c=3DUS??(cn=3DBJohn Smith)"));
var calendar = new Calendar();
var vEvent = new CalendarEvent
{
Start = new CalDateTime(DateTime.Parse("2016-07-23T07:00:00-04:00")),
End = new CalDateTime(DateTime.Parse("2016-07-23T08:00:00-04:00")),
};
vEvent.Attachments = new List<Attachment> { attachment };
calendar.Events.Add(vEvent);And we can get the URI back:
var uri = calendar
.Events
.First()
.Attachments
.Select(a => a.Uri)
.Single();Base64-encoded attachments can represent anything: numbers, strings, serialized objects, etc. If you can turn it into a byte array (byte[]), you can create an attachment from it.
This example shows how to attach a JSON-serialized representation of an object to a CalendarEvent.
public class SomeObject
{
public List<string> TheList { get; }
public int TheNumber { get; }
public ISet<string> TheSet { get; }
public SomeObject(List<string> theList, int theNumber, IEnumerable<string> theSet)
{
TheList = theList;
TheNumber = theNumber;
TheSet = new HashSet<string>(theSet);
}
}Suppose you serialize an instance to JSON:
var collection = new List<string>
{
"Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz",
"Foo", "Bar", "Baz", "Foo", "Bar", "Baz", "Foo", "Bar", "Baz",
};
var someObject = new SomeObject(thisList: collection, theNumber: 42, theSet: collection);
var json = JsonConvert.SerializeObject(someObject); //JSON.netAnd you want to attach it to an instance of a CalendarEvent object:
var asBytes = Encoding.UTF8.GetBytes(json);
var binaryAttachment = new Attachment(asBytes);
var calendar = new Calendar();
var vEvent = new CalendarEvent
{
Start = new CalDateTime(DateTime.Parse("2016-07-23T07:00:00-04:00")),
End = new CalDateTime(DateTime.Parse("2016-07-23T08:00:00-04:00")),
};
vEvent.Attachments = new List<Attachment> { attachment };
calendar.Events.Add(vEvent);You can then rehydrate an instance of SomeObject:
var newSomeObj = calendar
.Events
.First()
.Attachments
.Select(a => Encoding.UTF8.GetString(a.Data))
.Select(json => JsonConvert.DeserializeObject<SomeObject>(json))
.Single();Clone this wiki locally
You can’t perform that action at this time.