Category Archives: Visual Studio

การสร้าง Web Services และเรียกใช้งาน Web Services ด้วย Visual Studio 2015

สร้าง 2 โปรเจ็กส์

โปรเจ็กส์ 1: สร้างโปรเจ็กส์ให้บริการเว็บเซอร์วิส มีเว็บเมธอดให้บริการ 2 เมธอด

  • มีเว็บเมธอด HelloWorld() คืนค่าเป็นสตริง Hello World
  • มีเว็บเมธอด ConvertTemperature() รับพารามิเตอร์เป็นองศาฟาเรนไฮ และคืนค่าเป็นองศาเซลเซียส

โปรเจ็กส์ 2: สร้างโปรเจ็กส์วินโดว์เดสท็อป เรียกใช้งานเว็บเซอร์วิส

  • เรียกใช้งานเว็บเมธอด ConvertTemperature()

Visual Studio Tools for Office เขียน VBA Excel ด้วย C# สำหรับ .NET programmer

VBA Excel ด้วย C# สำหรับ .NET programmer

สิ่งที่ต้องมีสำหรับการพัฒนา Excel Programming ด้วย C#

Visual Studio ที่ได้ติดตั้ง visual studio tool for office  ซึ่งจะให้เราสามารถสร้าง Microsof Office Project ได้จาก Visual Studio

vto 2005 sp1

vto 3

เครื่องคอมพิวเตอร์ที่ใช้งานได้ทำการติดตั้ง Microsoft Excel 2003 และทำการ update เป็น Service Pack 1

เมื่อได้ติดตั้งทุกอย่างเรียบร้อยแล้วก็เริ่มลงมือเขียน program กันได้เลยครับ

สร้าง project ใหม่

เริ่มเขียนคำสั่งในรูปแบบ code behine คล้ายๆ กับ Windows Form หรือ Web Form

run แบบไม่ต้อง debug ด้วยการกดปุ่ม ctrl + f5 workbook Microsoft Excel จะเปิดขึ้นมาและเรียกใช้งาน work book ที่เราได้เขียนคำสั่งไว้

ได้ผลลัพธ์ตามที่เราต้องการ

เปรียบเทียบกับการใช้งานกับการเขียนด้วย VB Script (VBA)

นี้เป็นความเห็นส่วนตัวของผมเองนะครับ

โดยส่วนตัวในแง่ของการเขียนคำสั่ง ชอบวิธีการของ Visual Studio For Office มากกว่า เพราะสามารถเขียนด้วยภาษา C# ซึ่งเป็นภาษาโปรดของผม และยังได้ความสามารถต่างของ Visual Studio มาช่วยในการเขียน program ได้ง่ายขึ้น เช่น intellisence หรือ auto complete อีกทั้ง c# ก็มี compiler ที่ฉลาดแสดงผลความผิดพลาดที่อ่านได้เข้าใจง่าย

แต่สิ่งที่การเขียนด้วย VBA ได้เปรียบกว่าคือ

เปิด workbook แล้วเรียกใช้คำสั่งที่เขียนเพิ่มเข้าไปได้เร็วกว่าวิธีของ VTO

copy ไปใช้ต่อได้ทันที่ ไม่ต้องทำการเปิด permission ให้กับ dll ที่ได้จากวิธีการของ vto

การพัฒนาหรือแก้ไขไม่จำเป็นต้องมี visual studio แค่เปิด file ด้วย excel ก็สามารถแก้ไขงานได้ทันที

หากต้องเลือกวิธีการใดวิธีการหนึ่งก็ trade off กันแล้วกันนะครับ

สำหรับคนที่เป็น VB อยู่แล้วก็อาจจะเลือก VBA

แต่สำหรับที่เป็น C# เขียน Excel programming ก็เป็นทางเลือกที่น่าสนใจ

tip

สำหรับผมคิดว่าสิ่งที่ยากที่สุดที่เจอในการเขียนก็คือ ขั้นตอนของการสร้าง project เพราะได้หาวิธีการแก้ไขหลายอย่างจนกว่าจะสร้าง project ใหม่ได้ จึงขอเขียนคำแนะนำเพิ่มเติมคือ

หากสร้าง project ไม่ได้

ให้ดูว่าเราได้ update office 2003 เป็น SP1 ยัง

ติดตั้ง VTO 2005 และ VTO 3 ยัง

หากยังสร้าง project ไม่ได้แนะนำให้ uninstall vto ทั้งสองตัวออกและติดตั้งใหม่

Ref: codesanook.com

 

สร้าง MSDN style document (.chm) จาก XML comment ง่าย ๆ ด้วย NAnt และ NDoc Task

คัดลอกมาจาก: codesanook.com

ในภาษา C# เราสามารถที่จะทำการ Comment เนื้อหาบางส่วนของโปรแกรม เพื่อไม่ให้ compiler นำไปแปลความหมาย ซึ่งจะมีประโยชน์ดังนี้

  • เขียนคำอธิบายการทำงานของคำสั่งที่เขียนขึ้น
  • เก็บส่วนที่ยังทำงานไม่ได้หรือยังไม่สมบูรณ์ไว้ โดยไม่ให้ compiler นำไปแปลความหมาย

ลักษณะการ Comment ของ C# แบ่งได้เป็น

  • Single Line Comment  Ex.
    // this is comment
  • Block Comment Ex.
    /*this is block
    comment */
  • XML Comment  Ex.
         /// <summary>
        /// This is comment.
        /// </summary>
จุดที่น่าสนใจก็คือ หากเรา comment class, property หรือ method ในแบบ XML เราสามารถใช้ NDoc สร้าง document file ในรูปแบบ MSDN-style HTML Help (.chm) ขึ้นมาได้ สำหรับเป็นคู่มืออธิบายการใช้งาน (help file) ของคลาสหรือคำสั่งอื่นๆ ภายในโปรแกรม  ช่วยให้นักพัฒนาโปรแกรม (developer) คนอื่นในทีมเข้าใจการใช้งานคลาสที่เราเขียนขึ้น และนำไปใช้งานต่อได้
ขั้นตอนการสร้าง XML document file
  • สร้าง comment อธิบายคลาส, พรอพเพอร์ตี และเมธอดที่เราได้สร้างขึ้น
    01 /// <summary>
    02    /// main class of program
    03    /// </summary>
    04    class Program
    05    {
    06        /// <summary>
    07        /// entry point of application and print message "Hello World" to screen
    08        /// </summary>
    09        ///<param name="args">command line arguments
    10        static void Main(string[] args)
    11        {
    12            Console.WriteLine("Hello World");
    13        }
    14    }      
  • ติดตั้ง NAnt และสร้าง build file ขึ้นมาให้ชื่อว่า ndoc.build ใน ndoc.build เขียนมี script ของ ndoc task ดังนี้
    01 <!--?xml version="1.0" encoding="utf-8" ?-->
    02 <project name="ndoc">
    03     
    04     <ndoc>
    05         
    06         <assemblies basedir="NDocTaskDemo\bin\Debug">
    07             <include name="NDocTaskDemo.exe">
    08         </include></assemblies>
    09         
    10         <summaries>
    11             <include name="NDocTaskDemo.xml">
    12         </include></summaries>
    13
    14         <documenters>
    15             <documenter name="MSDN">
    16
    17                 <property name="OutputDirectory" value="documents">
    18
    19                 <property name="HtmlHelpName" value="NDocTaskDemo">
    20
    21                 <property name="ShowMissingSummaries" value="True">
    22
    23                 <property name="HtmlHelpCompilerFilename"value="hhc.exe">
    24
    25                 <property name="IncludeFavorites" value="False">
    26
    27                 <property name="Title" value="MySystem (NDoc)">
    28
    29                 <property name="SplitTOCs" value="False">
    30
    31                 <property name="DefaulTOC" value="">
    32
    33                 <property name="ShowVisualBasic" value="False">
    34
    35                 <property name="ShowMissingSummaries" value="True">
    36
    37                 <property name="ShowMissingRemarks" value="False">
    38
    39                 <property name="ShowMissingParams" value="True">
    40
    41                 <property name="ShowMissingReturns" value="True">
    42
    43                 <property name="ShowMissingValues" value="True">
    44
    45                 <property name="DocumentInternals" value="True">
    46
    47                 <property name="DocumentProtected" value="True">
    48
    49                 <property name="DocumentPrivates" value="True">
    50
    51                 <property name="DocumentEmptyNamespaces"value="False">
    52
    53                 <property name="IncludeAssemblyVersion"value="True">
    54
    55                 <property name="CopyrightText" value="Copyright - CodeSanook.com">
    56
    57                 <property name="CopyrightHref"value="http://www.codesanook.com">
    58              </documenter>
    59         </documenters>
    60
    61     </ndoc>
    62     
    63 </project>

     

  • เปิด command prompt ในตำแหน่งที่เก็บ project.build เรียกใช้งาน build file นี้ด้วยคำสั่ง nant จะมีผลลัพธ์แสดงที่หน้าจอดังนี้
    G:\blogging content\ndoc\NDocTaskDemo>nant
    NAnt 0.91 (Build 0.91.3801.0; alpha1; 5/29/2010)
    Copyright (C) 2001-2010 Gerry Shaw
    http://nant.sourceforge.net
    Buildfile: file:///G:/blogging content/ndoc/NDocTaskDemo/NDoc.build
    Target framework: Microsoft .NET Framework 4.0
         [ndoc] Initializing…
         [ndoc] Merging XML documentation…
         [ndoc] Building file mapping…
         [ndoc] Loading XSLT files…
         [ndoc] Generating HTML pages…
         [ndoc] Generating HTML content file…
         [ndoc] Compiling HTML Help file…
         [ndoc] Done.
    BUILD SUCCEEDED
    Total time: 7.9 seconds.
    G:\blogging content\ndoc\NDocTaskDemo>
  • เข้าไปใน folder ที่กำหนดไว้ให้สร้าง XML document file ขึ้นมา จะมี file ชื่อ NDocTaskDemo.chm
  • เปิด NDocTaskDemo.chm ขึ้นมา จะมีคำอธิบาย class และ method ที่เราได้เขียน comement ไว้

 

 

Debug JavaScript ด้วย Visual Studio

คัดลอกมาจาก: http://codesanook.com/

โดยส่วนตัว ผมเองพอทราบมาช่วงหนึ่งแล้วว่า Visual Studio สามารถ debug JavaScript ผมเคยได้ลอง set break point ในคำสั่ง JavaScript แต่พอลอง debug ดู โปรแกรมก็ไม่ได้มาหยุดที่ break point จึงไม่สามารถ debug JavaScript ได้ และประกอบกับผมเองก็ใช้งาน FireFox เป็นหลักจึงหันไปใช้การ debug JavaScript ด้วย FireBug ที่เป็น add-on ของ FireFox แทน แต่หลังจาก debug ด้วย FireBug มาช่วงหนึ่ง ผมพบว่ามีบ้างครั้งที่ผมสั่งให้มีการทำงานแบบ step into ไม่ยอมทำงาน ทำให้ผมได้พยายามหา tool อื่นๆ มาช่วยการ debug JavaScript จนทำให้นึกถึงการ debug JavaScript ด้วย visual Studio ขึ้นมาอีกครั้ง แต่คราวนี้ผมได้พยายามหาข้อมูลอย่างเต็มที่ให้สามารถใช้งาน feature นี้ใน visual studio ให้ได้ จนท้ายที่สุดผมก็ได้พบคำตอบ เป็นวิธีการที่ง่ายมากๆ เพียงแค่เพิ่ม key word debugger; เข้าไปในส่วนบนของคำสั่ง JavaScript ที่เราจะ debug ดังตัวอย่างในภาพต่อไปนี้

ในตัวอย่างนี้ ผมได้ใช้ Visual Studio 2008 และ jQuery 1.4.2  เป็น JavaScript Framework

ขอให้สังเกตบรรทัดที่ 11 ที่ได้เพิ่ม key word debugger; เข้าไป

และบรรทัดที่ 14 ที่มีการ set break point เอาไว้

ผมได้ทำการ debug คำสั่ง JavaScript แบบง่าย ๆ เพื่อทดสอบว่าเมื่อ click ที่ปุ่มที่มี id clickMe โปรแกรม จะวิ่งมาหยุดที่ตรงบรรทัดที่มีคำสั่งเพื่อแสดง message box ที่มีข้อความว่า You’ve just clicked me !!!

เพื่อให้การ debug ทำงานได้ จำเป็นที่จะต้อง setting ค่าใน IE (Internet Explore) โดยเปิดโปรแกรม IE ขึ้นมา

เข้าไปที่ Tools > Internet Options

เลือก Tab Advanced เลื่อนหา Section Browsing

uncheck disable script debugging (Internet Explorer) และ disable script debugging (other) ดังภาพ

กดปุ่ม F5 เพื่อ debug โปรแกรม

แล้วทำการ step over , step into ได้ตามต้องการ

สามารถที่จะดูสถานะของ object ด้วย locals Window หรือทำการ add object to watch แบบเดียวกับกับการ debug C# หรือ VB.NET

ผมได้แนบ source code ของตัวอย่างนี้ สามารถโหลดได้ตาม link ข้างล่างนี้เลย

download source code

ลองนำวิธีนี้ไปใช้กันดูนะครับ คิดว่าจะเป็นประโยชน์มากเมื่อมีปัญหากับ JavaScript

Using WIA for scanning

I was playing around this morning with scanning images and put together an adapter class that uses the Windows automation library (WIAAUT.DLL) which is part of the WIA automation SDK — WIA means Windows Image Acquisition.

Here are the imports I used for the code file:

 

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using WIA;

 

I created a simple enumeration for some of the more common errors that I expected.

public enum WiaScannerError : uint
{
LibraryNotInstalled = 0x80040154,
OutputFileExists = 0x80070050,
ScannerNotAvailable = 0x80210015,
OperationCancelled = 0x80210064
}

Instead of throwing a COMException I created a special exception class that provides an error code from the aforementioned enumeration.

[Serializable]
public class WiaOperationException : 
Exception
{
private WiaScannerError _errorCode;

     public WiaOperationException(WiaScannerError errorCode)
base()
{
ErrorCode = errorCode;
}

     public WiaOperationException(string message, WiaScannerError errorCode)
base(message)
{
ErrorCode = errorCode;
}

public WiaOperationException(string message, Exception innerException)
base(message, innerException)
{
COMException comException = innerException as COMException;

if (comException != null)
ErrorCode = (WiaScannerError)comException.ErrorCode;
}

     public WiaOperationException(string message, Exception innerException, WiaScannerError errorCode)
base(message, innerException)
{
ErrorCode = errorCode;
}

public WiaOperationException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
base(info, context)
{
info.AddValue(“ErrorCode”, (uint)_errorCode);
}

public WiaScannerError ErrorCode
{
get return _errorCode; }
protected set { _errorCode = value; }
}

public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
base.GetObjectData(info, context);
ErrorCode = (WiaScannerError)info.GetUInt32(“ErrorCode”);
}
}

The actual class I created is just for scanners, but you can adapt it to any device that supports WIA.  I’ve pulled out comments and removed some extra stuff like providing a friendly message for errors for the sake of brevity.

public sealed class WiaScannerAdapter : IDisposable
{
private CommonDialogClass _wiaManager;
private bool _disposed; 
// indicates if Dispose has been called

    public WiaScannerAdapter()
{
}

~WiaScannerAdapter()
{
Dispose(false);
}

     private CommonDialogClass WiaManager
{
get return _wiaManager; }
set { _wiaManager = value; }
}

[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
     public Image ScanImage(ImageFormat outputFormat, string fileName)
{
if (outputFormat == null)
throw new ArgumentNullException(“outputFormat”);

FileIOPermission filePerm =
new FileIOPermission(FileIOPermissionAccess.AllAccess, fileName));
filePerm.Demand();

ImageFile imageObject = null;

try
{
if (WiaManager == null)
WiaManager = new CommonDialogClass();

imageObject =
WiaManager.ShowAcquireImage(WiaDeviceType.ScannerDeviceType,
WiaImageIntent.ColorIntent, WiaImageBias.MinimizeSize,
outputFormat.Guid.ToString(“B”), falsetruetrue);

imageObject.SaveFile(fileName);
return Image.FromFile(fileName);
}
catch (COMException ex)
{
string message = “Error scanning image“;
throw new WiaOperationException(message, ex);
}
finally
{
if (imageObject != null)
Marshal.ReleaseComObject(imageObject);
}
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

     private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// no managed resources to cleanup
}

// cleanup unmanaged resources
if (_wiaManager != null)
Marshal.ReleaseComObject(_wiaManager);

_disposed = true;
}
}
}

Calling the adapter is really easy.  Here’s an example that puts the image into a picturebox:

using (WiaScannerAdapter adapter = new WiaScannerAdapter())
{
try
{
Image image = adapter.ScanImage(ImageFormat.Bmp, @”c:\temp\test.bmp”);
pictureBox1.Image = image;
}
catch (WiaOperationException ex)
{
MessageBox.Show(ex.Message + “ Error Code: “ + ex.ErrorCode);
}
}

      Ref:

http://geekswithblogs.net/tonyt/archive/2006/07/29/86608.aspx

VS 2010 compiler error: Interop type XXX cannot be embedded. Use the applicable interface instead.

In most cases (such as error for the usage of UPnPNATClass as noted in one of the comments) this error is the result of code which tries to instantiate a COM object e.g. here piece of code starting up Excel:

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();

Here it is enough to say that Excel.ApplicationClass derives from Excel.Application interface and one can even instantiate Excel using Excel.Application interface. Rewriting this code as below produces exact same results:

Excel.Application xlapp = new Excel.Application();

Ref: http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx

CSharp using C++ DLL

ต่อเนื่องจาก C++ Dll Win32 Console Project

ในบทความนี้เป็นการใช้ C# เรียกใช้ DLL ที่เขียนจากภาษา C++

1. สร้างโปรเจ็กส์ C# เพื่อใช้งาน Dll ชื่อ CSConsole เป็นแบบ Console Application

2. สร้างโปรเจ็กส์ C# เพื่อใช้งาน Dll ชื่อ CSWinForm เป็นแบบ Windows Forms Application

เพิ่ม Code

using System;

using System.Collections.Generic;
using System.Linq;

using System.Text;

using System.IO;
using System.Runtime.InteropServices;

namespace CSConsole
{
    class Program
    {
        [DllImport("../../../Debug/CDll.dll")]
        public static extern int Calc(int no1, int no2);
        [DllImport("../../../Debug/CDll.dll")]
        internal static extern int _flushall();

        static void Main(string[] args)
        {
            int res;
            res = Calc(10, 20);
            Console.Write(res);
        }
    } 
}

เพิ่ม Code

using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace CSWinForm
{
    public partial class Form1 : Form
    {
        [DllImport("../../../Debug/CDll.dll")]
        public static extern int Calc(int no1, int no2);
        [DllImport("../../../Debug/CDll.dll")]
        internal static extern int _flushall();

        public Form1()
        {
            InitializeComponent();

            int res;
            res = Calc(10, 20);
            MessageBox.Show(res.ToString());
        }
    }

ที่มา: Platform Invoke Tutorial

 

C++ Dll Win32 Console Project

1. สร้างโปรเจ็กส์ C++ แบบ Dll ชื่อ CDll เป็นแบบ Win32 Console Application > Dll

2. สร้างโปรเจ็กส์ C++ เพื่อใช้งาน Dll ชื่อ WinConsole เป็นแบบ Win32 Console Application > Console Application

เพิ่ม Code

// CDll.cpp : Defines the exported functions for the DLL application. // 
#include "stdafx.h"

extern "C" _declspec(dllexport) int Calc(int no1,int no2)
{
    int result;
    result = no1 + no2;
    return result;
}

เพิ่ม Code

// WinConsole.cpp : Defines the entry point for the console application. // 
#include "stdafx.h"

extern "C" _declspec(dllimport) int Calc(int no1,int no2);

int _tmain(int argc, _TCHAR* argv[])
{
    int res;
    res = Calc(10,20);
    printf("%d",res);

    return 0;
}

ให้โปรเจ็กส์ WinConsole ทำการ Add reference project ไปที่โปรเจ็กส์ CDLL

ที่มา: Creation of a Simple DLLWalkthrough: Creating and Using a Dynamic Link Library

How to mix C and C++ ใน VC2005

เมื่อนำ code ภาษา c (ไฟล์ .c) มารัน อยู่ใน Project เดียวกันกับ .cpp แล้วเกิด Error ดังนี้
/Ycstdafx.h command-line option was not found in the source file
ให้แก้ไขด้วยการเพิ่ม #include “stdafx.h” ในไฟล์ .c
จากนั้นไปที่ Project > Properties > Configuration Properties > C/C++ > Precomplied Headers > Create/Use Precomplied Header
ให้เลือก Use Precomplied Header (/Yu)
เป็นอันเสร็จ