Strings.StrConvで全角に変換しようとする文字列にサロゲートペア文字が含まれていると"??"に変換されてしまいます。
Debug.WriteLine("𠀋=" + Strings.StrConv("𠀋", VbStrConv.Wide)); // 𠀋=??と表示される
「.NET Frameworkは文字列を内部的にUnicodeしており、標準機能のStrConvを使用しているからヨシ!」と思っていると失敗するので注意が必要です。
参考
Strings.StrConvで全角に変換しようとする文字列にサロゲートペア文字が含まれていると"??"に変換されてしまいます。
Debug.WriteLine("𠀋=" + Strings.StrConv("𠀋", VbStrConv.Wide)); // 𠀋=??と表示される
「.NET Frameworkは文字列を内部的にUnicodeしており、標準機能のStrConvを使用しているからヨシ!」と思っていると失敗するので注意が必要です。
参考
<cc1:FileDownloadButton ID="FileDownloadButton1" runat="server" Text="Download" OnDownloading="FileDownloadButton1_Downloading" OnDownloaded="FileDownloadButton1_Downloaded"/>
protected void FileDownloadButton1_Downloading(object sender, EventArgs e) { // Tempファイルを作成する var path = Path.GetTempFileName(); var file = new FileInfo(path); // Tempファイルへデータを出力する using (var s = file.OpenWrite()) using (var w = new StreamWriter(s)) { w.WriteLine("Hello"); w.Flush(); } // FileDownloadButtonのFileプロパティへTempファイルをセットする FileDownloadButton1.File = file; } protected void FileDownloadButton1_Downloaded(object sender, EventArgs e) { // Tempファイルを削除する FileDownloadButton1.File.Delete(); }
namespace HttpHandlerSample { // 動的にPNG画像を生成するクラス public class PngHandler : IHttpHandler { // このオブジェクトが再利用可能かを返すプロパティ public bool IsReusable { get { return true; } } // ...略... // HTTPリクエストを処理するメソッド public void ProcessRequest(HttpContext context) { // 画像を生成する using (var image = GenerateImage()) { // PNG形式でHTTPレスポンスへ出力する var output = context.Response.OutputStream; image.Save(output, ImageFormat.Png); output.Flush(); } // Content-TypeヘッダをPNG形式に設定する context.Response.ContentType = "image/png"; } // ...略... } }
<configuration> <system.webServer> <handlers> <add name="PngHandler" path="*.png" verb="GET" type="HttpHandlerSample.PngHandler"/> </handlers> </system.webServer> </configuration>ちなみに
var sb = new StringBuilder() .Append("select *").Append(Environment.NewLine) .Append(" from Table1").Append(Environment.NewLine) .Append(" where Column1 = @Value1").Append(Environment.NewLine);
var sw = new StringWriter(); sw.WriteLine("select *"); sw.WriteLine(" from Table1"); sw.WriteLine(" where Column1 = @Value1");
class Class1 { private readonly DbProviderFactory factory; private readonly string connectionString; public Class1(DbProviderFactory factory, string connectionString) { this.factory = factory; this.connectionString = connectionString; } public List<object> Method1() { using (var conn = factory.CreateConnection()) using (var command = factory.CreateCommand()) { conn.ConnectionString = connectionString; conn.Open(); command.Connection = conn; command.CommandText = "select * from Table1 where ID = @ID"; var param = factory.CreateParameter(); param.ParameterName = "ID"; param.Value = "ID1"; command.Parameters.Add(param); var reader = command.ExecuteReader(); var result = new List<object>(); while (reader.Read()) { var arr = new object[reader.FieldCount]; reader.GetValues(arr); result.Add(arr); } return result; } }
class MyPage : Page { protected void Page_PreRender(object sender, EventArgs e) { var args = "xxx"; // 例えば、詳細情報を表示するためのプライマリキー var js = ClientScript.GetPostBackEventReference(this, args); Table1.Rows[0].Cells[0].Attributes.Add("onclick", js); } }
// 上のクラスへIPostBackEventHandlerを実装 class MyPage : Page, IPostBackEventHandler { ... public void RaisePostBackEvent(string eventArgs) { // 例えばセッションへeventArgsをセットして詳細ページへ遷移する Session.Add("key", eventArgs); var detail = ResolveUrl("~/MyDetailPage.aspx"); Server.Transfer(detail); } }
var path = VirtualPathUtility.Combine(HttpRuntime.AppDomainVirtualPath, "Web.config"); var conf = WebConfigurationManager.OpenWebConfiguration(path);
class NetworkConfigurationSection : ConfigurationSection { [ConfigurationProperty("LocalHost")] public NetworkConfigElement LocalHost { get { return base["LocalHost"] as NetworkConfigElement; } set { base["LocalHost"] = value; } } [ConfigurationProperty("Networks")] public NetworkConfigElementCollection Networks { get { return base["Networks"] as NetworkConfigElementCollection; } } }
class NetworkConfigElement : ConfigurationElement { [ConfigurationProperty("IPAddress")] public string IPAddress { get { return base["IPAddress"] as string; } set { base["IPAddress"] = value; } } }
class NetworkConfigElementCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new NetworkConfigElement(); } protected override object GetElementKey(ConfigurationElement element) { NetworkConfigElement elm = element as NetworkConfigElement; if (null == elm) return null; return elm.IPAddress; } }
byte[] data = null; using (var memory = new MemoryStream()) { using (var gzip = new GZipStream(memory, CompressionMode.Compress)) { int input = 0; byte[] buffer = new byte[1]; while (-1 != (input = Console.Read())) { buffer[0] = Convert.ToByte(input); gzip.Write(buffer, 0, buffer.Length); } } data = memory.ToArray(); }
var clientHandler = new HttpClientHandler(); clientHandler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
using(var client = new HttpClient(clientHandler)) using(var content = new ByteArrayContent(data)) { content.Headers.ContentEncoding.Add("gzip"); using(var message = client.PostAsync(url, content).Result) { Console.WriteLine(message.Content.ReadAsStringAsync().Result); } }
<configuration> <system.diagnostics> <trace autoflush="true"> <listeners> <clear /> <add name="file" type="System.Diagnostics.TextWriterTraceListener" initializeData="TEXT-WRITER.log"> <!-- Warning以上を出力 --> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning" /> </add> </listeners> </trace> </system.diagnostics> </configuration>
TraceTest Warning: 0 : TraceWarning TraceTest Error: 0 : TraceError
<configuration> <system.diagnostics> <trace autoflush="true"> <listeners> <clear /> <!-- テキストファイル --> <add name="file" type="System.Diagnostics.TextWriterTraceListener" initializeData="TEXT-WRITER.log" traceOutputOptions="Callstack, DateTime, LogicalOperationStack, ProcessId, ThreadId, Timestamp" /> </listeners> </trace> </system.diagnostics> </configuration>
TraceTest.exe Information: 0 : TraceInformation ProcessId=5700 LogicalOperationStack= ThreadId=1 DateTime=2014-02-02T12:47:28.3398027Z Timestamp=6032477769 Callstack= 場所 System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) 場所 System.Environment.get_StackTrace() 場所 System.Diagnostics.TraceEventCache.get_Callstack() 場所 System.Diagnostics.TraceListener.WriteFooter(TraceEventCache eventCache) 場所 System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String message) 場所 System.Diagnostics.TraceInternal.TraceEvent(TraceEventType eventType, Int32 id, String format, Object[] args) 場所 TraceTest.TraceTest.Main(String[] args)
namespace TraceTest { using System.Diagnostics; public class TraceTest { public static void Main(string[] args) { Trace.TraceInformation("TraceInformation"); Trace.TraceWarning("TraceWarning"); Trace.TraceError("TraceError"); } } }
<configuration> <system.diagnostics> <trace autoflush="true"> <listeners> <clear /> <!-- 標準出力 --> <add name="console" type="System.Diagnostics.ConsoleTraceListener" /> <!-- 区切りリスト --> <add name="delimited-list" type="System.Diagnostics.DelimitedListTraceListener" initializeData="DELIMITED-LIST.log" /> <!-- イベントログ --> <add name="eventlog" type="System.Diagnostics.EventLogTraceListener" initializeData="Application" /> <!-- テキストファイル --> <add name="file" type="System.Diagnostics.TextWriterTraceListener" initializeData="TEXT-WRITER.log" /> <!-- XML形式 --> <add name="xml-writer" type="System.Diagnostics.XmlWriterTraceListener" initializeData="XML-WRITER.log" /> </listeners> </trace> </system.diagnostics> </configuration>参考
using System; | |
using System.ComponentModel; | |
using System.Windows.Forms; | |
namespace Sample { | |
public class ShowingHidingForm : Form { | |
private event FormShowingEventHandler formShowing; | |
private event FormHidingEventHandler formHiding; | |
public event FormShowingEventHandler FormShowing { | |
add { formShowing += value; } | |
remove { formShowing -= value; } | |
} | |
public event FormHidingEventHandler FormHiding { | |
add { formHiding += value; } | |
remove { formHiding -= value; } | |
} | |
public ShowingHidingForm() { | |
formShowing += (sender, e) => {}; | |
formHiding += (sender, e) => {}; | |
} | |
protected override void SetVisibleCore (bool value) { | |
var current = Visible; | |
var toBe = value; | |
if (current == toBe) { | |
base.SetVisibleCore(toBe); | |
return; | |
} | |
if (toBe && !current) { | |
var e = new FormShowingEventArgs(); | |
formShowing(this, e); | |
if (e.Cancel) { | |
toBe = current; | |
} | |
} | |
if (!toBe && current) { | |
var e = new FormHidingEventArgs(); | |
formHiding(this, e); | |
if (e.Cancel) { | |
toBe = current; | |
} | |
} | |
base.SetVisibleCore(toBe); | |
} | |
public static void Main(string[] args) { | |
var form = new ShowingHidingForm(); | |
form.FormShowing += (sender, e) => { | |
Console.WriteLine("Showing"); | |
}; | |
form.FormHiding += (sender, e) => { | |
Console.WriteLine("Hiding"); | |
}; | |
form.FormClosing += (sender, e) => { | |
form.Hide(); | |
Console.WriteLine("Closing"); | |
}; | |
Application.Run(form); | |
} | |
} | |
public delegate void FormShowingEventHandler(object sender, FormShowingEventArgs e); | |
public delegate void FormHidingEventHandler(object sender, FormHidingEventArgs e); | |
public class FormShowingEventArgs : CancelEventArgs { } | |
public class FormHidingEventArgs : CancelEventArgs { } | |
} |
// cl callCOM.c ole32.lib oleaut32.lib | |
#include <Objbase.h> | |
int main() { | |
HRESULT hr; | |
CLSID clsid; | |
DISPID dispid; | |
VARIANTARG rgvArg[2]; | |
int result = 0; | |
DISPPARAMS dispParams = {NULL, NULL, 0, 0}; | |
VARIANT varResult; | |
EXCEPINFO excepInfo; | |
UINT uArgErr; | |
OLECHAR *lpszProgID = L"NamespaceSample.ClassSample"; | |
OLECHAR *rgszNames = {L"MethodSample"}; | |
IUnknown *pUnknown = NULL; | |
IDispatch *pDispatch = NULL; | |
// 1. 初期化 | |
hr = CoInitialize(NULL); | |
if (FAILED(hr)) { | |
return -10; | |
} | |
// 2. クラス名からCLSIDを取得 | |
hr = CLSIDFromProgID(lpszProgID, &clsid); | |
if (FAILED(hr)) { | |
CoUninitialize(); | |
return -20; | |
} | |
// 3. インスタンス作成 | |
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&pUnknown); | |
if (FAILED(hr)) { | |
CoUninitialize(); | |
return -30; | |
} | |
// 4. IDispatchへキャスト | |
hr = pUnknown->lpVtbl->QueryInterface(pUnknown, &IID_IDispatch, (void **)&pDispatch); | |
if (FAILED(hr)) { | |
pUnknown->lpVtbl->Release(pUnknown); | |
CoUninitialize(); | |
return -40; | |
} | |
// 5. メソッド名からDISPIDを取得 | |
hr = pDispatch->lpVtbl->GetIDsOfNames(pDispatch, &IID_NULL, &rgszNames, 1, LOCALE_SYSTEM_DEFAULT, &dispid); | |
if (FAILED(hr)) { | |
pUnknown->lpVtbl->Release(pUnknown); | |
CoUninitialize(); | |
return -50; | |
} | |
// 6. パラメータの設定 | |
VariantInit(&rgvArg[0]); | |
rgvArg[0].vt = VT_I4; | |
rgvArg[0].lVal = 99; | |
VariantInit(&rgvArg[1]); | |
rgvArg[1].vt = VT_BSTR; | |
rgvArg[1].bstrVal = SysAllocString(L"HOGE"); | |
dispParams.rgvarg = rgvArg; | |
dispParams.cArgs = 2; | |
VariantInit(&varResult); | |
// 7. メソッドの呼び出し | |
hr = pDispatch->lpVtbl->Invoke(pDispatch, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, &varResult, &excepInfo, &uArgErr); | |
if (FAILED(hr)) { | |
pUnknown->lpVtbl->Release(pUnknown); | |
CoUninitialize(); | |
return -60; | |
} | |
// 8. 終了処理 | |
printf("%S\n", varResult.bstrVal); | |
pUnknown->lpVtbl->Release(pUnknown); | |
CoUninitialize(); | |
return 0; | |
} |
// csc /target:library ClassSample.cs | |
// regasm /codebase ClassSample.dll | |
// regasm /u ClassSample.dll | |
namespace NamespaceSample { | |
using System.Runtime.InteropServices; | |
// ComVisibleAttributeをCOM経由で呼び出したいクラスへ設定する | |
[ComVisible(true)] | |
public class ClassSample { | |
public string MethodSample(string arg1, int arg2) { | |
return string.Format("arg1={0} arg2={1}", arg1, arg2); | |
} | |
} | |
} |