SlideShare ist ein Scribd-Unternehmen logo
1 von 35
COMU+
こみゅぷらす
Sep 27, 2013
小島 富治雄
Roslyn による Visual Studio のアドイン
COMU+
こみゅぷらす
自己紹介
• 小島 富治雄
• @Fujiwo
• 福井コンピュータアーキテクト株式会社
• Microsoft MVP C# (2005-2014)
COMU+
こみゅぷらす
本日の資料
• http://blog.shos.info/archives/2013/07/addinbyroslyn.html
にて公開します
• スライドは
http://www.slideshare.net/Fujiwo/roslyn-visual-studio
COMU+
こみゅぷらす
宣伝
• 来週土曜
「Hokuriku.NET Vol.12 in 福井」
http://atnd.org/events/40509
※ 個人の体験です。効果には個人差があります。
COMU+
こみゅぷらす
Roslyn について
COMU+
こみゅぷらす
Roslyn
• C# や Visual Basic のコンパイラー
の内部の API 等を公開
• "Compiler as a Service" と表現
http://www.zdnet.com/blog/microsoft/microsofts-roslyn-compiler-as-a-service-support-unlikely-to-be-in-visual-studio-2012/10896 より
COMU+
こみゅぷらす
Microsoft “Roslyn” CTP
• http://msdn.microsoft.com/en-
us/vstudio/roslyn.aspx
COMU+
こみゅぷらす
Roslyn
• 参考: Channel 9 のビデオと資料
– Future directions for C# and Visual Basic -
BUILD2011 (September 15, 2011)
– Going Deeper with Project Roslyn: Exposing the
C# and VB compiler’s code analysis - Lang.NEXT
2012 (April 3, 2012)
– Roslyn Anders Hejlsberg Q&A:
TypeScript, C#, Roslyn, and More - Build 2013
(June 27, 2013)
COMU+
こみゅぷらす
Roslyn の機能
• C# や Visual Basic のソースコード解析機能
• Visual Studio の拡張機能
• C#スクリプト機能
• 等
http://www.zdnet.com/blog/microsoft/microsofts-roslyn-compiler-as-a-service-support-unlikely-to-be-in-visual-studio-2012/10896 より
COMU+
こみゅぷらす
本日のデモ
• 今日は、「ソースコード解析機能」を用いて、
簡単な Visual Studio のアドインを
• C# のソースコードを解析して、識別子等を数え
て、それを WPF で作成したウィンドウに表示
COMU+
こみゅぷらす
「Visual Studio アドイン」プロジェクトの新規作成
COMU+
こみゅぷらす
NuGet から Roslyn をインストール
COMU+
こみゅぷらす
Roslyn 追加後のプロジェクトの参照設定
COMU+
こみゅぷらす
ViewModel の作成
• 今回 WPF で出すウィンドウ用のViewModel
• ソースコード内の識別子や using、クラス等の
数を保持
※ 実装の参考:
「INotifyPropertyChanged の実装に便利なクラスとコードスニペット」
COMU+
こみゅぷらす
ViewModel
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
namespace AddinByRoslyn
{
public static class PropertyChangedEventHandlerExtensions
{
public static void Raise(this PropertyChangedEventHandler onPropertyChanged, object
sender, [CallerMemberName] string propertyName = "")
{
if (onPropertyChanged != null)
onPropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
public static void Raise<PropertyType>(this PropertyChangedEventHandler
onPropertyChanged, object sender, Expression<Func<PropertyType>> propertyExpression)
{ onPropertyChanged.Raise(sender, propertyExpression.GetMemberName()); }
static string GetMemberName<MemberType>(this Expression<Func<MemberType>> expression)
{ return ((MemberExpression)expression.Body).Member.Name; }
}
COMU+
こみゅぷらす
ViewModelpublic class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
int identifierCount = 0;
public int IdentifierCount
{
get { return identifierCount; }
set {
if (value != identifierCount) {
identifierCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int usingCount = 0;
public int UsingCount
{
get { return usingCount; }
set {
if (value != usingCount) {
usingCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int classCount = 0;
public int ClassCount
{
get { return classCount; }
set {
if (value != classCount) {
classCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int fieldCount = 0;
public int FieldCount
{
get { return fieldCount; }
set {
if (value != fieldCount) {
fieldCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
COMU+
こみゅぷらす
ViewModel
int propertyCount = 0;
public int PropertyCount
{
get { return propertyCount; }
set {
if (value != propertyCount) {
propertyCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int methodCount = 0;
public int MethodCount
{
get { return methodCount; }
set {
if (value != methodCount) {
methodCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int variableCount = 0;
public int VariableCount
{
get { return variableCount; }
set {
if (value != variableCount) {
variableCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
int ifCount = 0;
public int IfCount
{
get { return ifCount; }
set {
if (value != ifCount) {
ifCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
COMU+
こみゅぷらす
ViewModel
int lambdaCount = 0;
public int LambdaCount
{
get { return lambdaCount; }
set {
if (value != lambdaCount) {
lambdaCount = value;
PropertyChanged.Raise(this);
RaiseUpdateData();
}
}
}
public object Data
{
get {
return new [] {
new { 名称 = "識別子の数" , 結果 =
IdentifierCount },
new { 名称 = "using の数" , 結果 = UsingCount },
new { 名称 = "クラスの数" , 結果 = ClassCount },
new { 名称 = "フィールドの数", 結果 =
FieldCount },
new { 名称 = "プロパティの数", 結果 =
PropertyCount },
new { 名称 = "メソッドの数" , 結果 =
MethodCount },
new { 名称 = "変数の数" , 結果 =
VariableCount },
new { 名称 = "if の数" , 結果 = IfCount },
new { 名称 = "ラムダ式の数" , 結果 =
string result = string.Empty;
public string Result
{
get { return result; }
set {
if (value != result) {
result = value;
PropertyChanged.Raise(this);
}
}
}
public void Clear()
{
IdentifierCount = UsingCount =
ClassCount = FieldCount =
PropertyCount = MethodCount =
VariableCount = IfCount =
LambdaCount = 0;
Result = string.Empty;
}
void RaiseUpdateData()
{ PropertyChanged.Raise(this, () => Data); }
}
}
COMU+
こみゅぷらす
Roslyn を用いたコード解析部
• Roslyn.Compilers.CSharp.SyntaxWalker
クラスを継承
• SyntaxWalker クラス
– Visitor パターン
– Visit メソッドを呼ぶと、全ノードを辿
り、ノードの種類毎の virtual メソッド
を呼ぶ
• 例えば、識別子のノードの場合には、
VisitIdentifierName という virtual メソッ
ドが呼ばれる
• それぞれの virtual メソッドをオーバーライ
ドすれば、そこに処理を書ける
• 今日は、呼ばれた回数を数えるだけ
COMU+
こみゅぷらす
Roslyn を用いたコード解析部
using Roslyn.Compilers.CSharp;
using System.IO;
using System.Text;
namespace AddinByRoslyn
{
class SyntaxCounter : SyntaxWalker
{
readonly ViewModel viewModel;
StringBuilder stringBuilder; // viewModel.Result 用
public SyntaxCounter(ViewModel viewModel)
{ this.viewModel = viewModel; }
// ソース ファイルの中を解析
public void AnalyzeSourceFile(string sourceFileName)
{
using (var reader = new StreamReader(sourceFileName, false)) {
var sourceCode = reader.ReadToEnd();
Analyze(sourceCode);
}
}
COMU+
こみゅぷらす
Roslyn を用いたコード解析部
// ソース コードの中を解析
void Analyze(string sourceCode)
{
// Roslyn.Compilers.CSharp.SyntaxTree クラスによるシンタックス ツリーの取得
var tree = SyntaxTree.ParseText(sourceCode);
Analyze(tree.GetRoot()); // シンタックス ツリーのルート要素を解析
}
// ルート要素の中を解析
void Analyze(CompilationUnitSyntax root)
{
viewModel.Clear();
stringBuilder = new StringBuilder();
Visit(root); // Visit メソッドにより、全ノードを辿る (Visitor パターン)
viewModel.Result = stringBuilder.ToString();
}
// 全ノードについて
public override void DefaultVisit(SyntaxNode node)
{
base.DefaultVisit(node);
// ノードの情報を stringBuilder に追加
stringBuilder.AppendLine(string.Format("NodeType: {0}, Node:
{1}", node.GetType().Name, node.GetText()));
}
COMU+
こみゅぷらす
Roslyn を用いたコード解析部// 識別子のノードの場合
public override void VisitIdentifierName(IdentifierNameSyntax node)
{
base.VisitIdentifierName(node);
viewModel.IdentifierCount++; // 識別子を数える
}
// using のノードの場合
public override void VisitUsingDirective(UsingDirectiveSyntax node)
{
base.VisitUsingDirective(node);
viewModel.UsingCount++; // using を数える
}
// クラスのノードの場合
public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
base.VisitClassDeclaration(node);
viewModel.ClassCount++; // クラスを数える
}
// フィールドのノードの場合
public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
{
base.VisitFieldDeclaration(node);
viewModel.FieldCount++; // フィールドを数える
}
COMU+
こみゅぷらす
Roslyn を用いたコード解析部
// プロパティのノードの場合
public override void VisitPropertyDeclaration(PropertyDeclarationSyntax
node)
{
base.VisitPropertyDeclaration(node);
viewModel.PropertyCount++; // プロパティを数える
}
// メソッドのノードの場合
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
base.VisitMethodDeclaration(node);
viewModel.MethodCount++; // メソッドを数える
}
// 変数のノードの場合
public override void VisitVariableDeclaration(VariableDeclarationSyntax
node)
{
base.VisitVariableDeclaration(node);
viewModel.VariableCount++; // 変数を数える
}
// if のノードの場合
public override void VisitIfStatement(IfStatementSyntax node)
{
base.VisitIfStatement(node);
COMU+
こみゅぷらす
Roslyn を用いたコード解析部
// シンプルなラムダ式のノードの場合
public override void VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node)
{
base.VisitSimpleLambdaExpression(node);
viewModel.LambdaCount++; // ラムダ式を数える
}
// 括弧付きのラムダ式のノードの場合
public override void VisitParenthesizedLambdaExpression(ParenthesizedLambdaExpressionSyntax node)
{
base.VisitParenthesizedLambdaExpression(node);
viewModel.LambdaCount++; // ラムダ式を数える
}
}
}
COMU+
こみゅぷらす
View.xaml
• XAML の Grid 内
– ViewModel の Result を表示するための
TextBox
– ViewModel の Data を表示するための
DataGrid
• プロジェクトに System.Xaml への参照設定を追
加
COMU+
こみゅぷらす
View.xaml
<Window x:Class="AddinByRoslyn.View"
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"
mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="500">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox TextWrapping="Wrap" Text="{Binding Path=Result}" FontFamily="Meiryo"
FontSize="14" IsReadOnlyCaretVisible="True" VerticalScrollBarVisibility="Auto" />
<DataGrid Grid.Row="1" ItemsSource="{Binding Path=Data}" FontFamily="Meiryo"
FontSize="14" />
</Grid>
</Window>
COMU+
こみゅぷらす
View.xaml.cs
• ViewModel のインスタンスを保持
– DataContext
• コンストラクターで C# のソース ファイル名を
受け取る
– SyntaxCounter クラスで解析
COMU+
こみゅぷらす
View.xaml.cs
using System.Windows;
namespace AddinByRoslyn
{
public partial class View : Window
{
ViewModel viewModel = new ViewModel();
public View(string sourceFileName)
{
InitializeComponent();
DataContext = viewModel; // DataContext に ViewModel のインスタンスを設定
if (!string.IsNullOrWhiteSpace(sourceFileName))
// SyntaxCounter クラスを用いたソース ファイルの解析
new SyntaxCounter(viewModel).AnalyzeSourceFile(sourceFileName);
}
}
}
COMU+
こみゅぷらす
• ViewModel のインスタンスを保持
– DataContext
• コンストラクターで C# のソース ファイル名を
受け取る
– SyntaxCounter クラスで解析
COMU+
こみゅぷらす
Visual Studio アドイン部
• Visual Studio アドイン部のコード
をカスタマイズ
–プロジェクトの新規作成時に自動生成
された Connect.cs 内
–Exec メソッドの中で View を作成し、
ソースコード ファイル名を渡す
COMU+
こみゅぷらす
Visual Studio アドイン部
// カスタマイズする Exec メソッド
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref
object varOut, ref bool handled)
{
if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault &&
commandName == "AddinByRoslyn.Connect.AddinByRoslyn") {
var view = new View(GetSourceFileName()); // View のインスタンスにソースファイル名を渡す
view.Show();
handled = true;
} else {
handled = false;
}
}
// ソース ファイル名の取得 (追加する private メソッド)
string GetSourceFileName()
{
var items = _applicationObject.SelectedItems;
if (items.Count == 0)
return null;
var item = items.Item(1);
return item.ProjectItem.get_FileNames(1);
}
COMU+
こみゅぷらす
実行結果
COMU+
こみゅぷらす
実行結果
COMU+
こみゅぷらす
まとめ
• 今日は、Roslyn を使って何種類かの文法要素を
数えただけ
• 同様の方法で、より複雑な解析を行ったり、一
部を変更できる
• Roslyn の機能は C# や Visual Basic のソース
コードの解析だけではない
COMU+
こみゅぷらす

Weitere ähnliche Inhalte

Was ist angesagt?

メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#Fujio Kojima
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009miwarin
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミングUnity Technologies Japan K.K.
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 

Was ist angesagt? (20)

メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Map
MapMap
Map
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
初めてのSTL
初めてのSTL初めてのSTL
初めてのSTL
 

Andere mochten auch

Apresentação Final Converse Clothing
Apresentação Final Converse ClothingApresentação Final Converse Clothing
Apresentação Final Converse Clothingpaula jung
 
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」Fujio Kojima
 
blogging pedagogy (my personal timeline)
blogging pedagogy (my personal timeline)blogging pedagogy (my personal timeline)
blogging pedagogy (my personal timeline)bonnie lenore kyburz
 
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~Fujio Kojima
 

Andere mochten auch (9)

Apresentação Final Converse Clothing
Apresentação Final Converse ClothingApresentação Final Converse Clothing
Apresentação Final Converse Clothing
 
Writing studs 2015
Writing studs 2015Writing studs 2015
Writing studs 2015
 
writing studs 2015
writing studs 2015writing studs 2015
writing studs 2015
 
Enchanting the Mundane
Enchanting the MundaneEnchanting the Mundane
Enchanting the Mundane
 
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」
2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」
 
blogging pedagogy (my personal timeline)
blogging pedagogy (my personal timeline)blogging pedagogy (my personal timeline)
blogging pedagogy (my personal timeline)
 
reflection
reflectionreflection
reflection
 
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
 
the personal essay
the personal essaythe personal essay
the personal essay
 

Ähnlich wie Roslyn による Visual Studio のアドイン

「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング幸雄 村上
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について豊明 尾古
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfKosuke Saigusa
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swiftYuki Asai
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swiftYuki Asai
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Mori Tetsuya
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 

Ähnlich wie Roslyn による Visual Studio のアドイン (20)

「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
burikaigi2024.pptx
burikaigi2024.pptxburikaigi2024.pptx
burikaigi2024.pptx
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdf
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 

Mehr von Fujio Kojima

Burikaigi 2023「C# Live Coding!」 小島の分
Burikaigi  2023「C# Live Coding!」 小島の分Burikaigi  2023「C# Live Coding!」 小島の分
Burikaigi 2023「C# Live Coding!」 小島の分Fujio Kojima
 
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発Fujio Kojima
 
.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発Fujio Kojima
 
BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分Fujio Kojima
 
.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~Fujio Kojima
 
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~Fujio Kojima
 
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分Fujio Kojima
 
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights FukuiFujio Kojima
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 Fujio Kojima
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編Fujio Kojima
 
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分Fujio Kojima
 
機械学習入門
機械学習入門機械学習入門
機械学習入門Fujio Kojima
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようFujio Kojima
 
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」Fujio Kojima
 
.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分Fujio Kojima
 
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...Fujio Kojima
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~Fujio Kojima
 
Microsoft .NET 入門
Microsoft .NET 入門Microsoft .NET 入門
Microsoft .NET 入門Fujio Kojima
 

Mehr von Fujio Kojima (20)

Burikaigi 2023「C# Live Coding!」 小島の分
Burikaigi  2023「C# Live Coding!」 小島の分Burikaigi  2023「C# Live Coding!」 小島の分
Burikaigi 2023「C# Live Coding!」 小島の分
 
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
 
.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発
 
BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分
 
.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~
 
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
 
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
 
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
 
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
 
機械学習入門
機械学習入門機械学習入門
機械学習入門
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
 
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
 
.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分
 
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
 
HTML5 on ASP.NET
HTML5 on ASP.NETHTML5 on ASP.NET
HTML5 on ASP.NET
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
 
C# 6.0 Preview
C# 6.0 PreviewC# 6.0 Preview
C# 6.0 Preview
 
Microsoft .NET 入門
Microsoft .NET 入門Microsoft .NET 入門
Microsoft .NET 入門
 

Roslyn による Visual Studio のアドイン