Archive

Posts Tagged ‘.Net’

When and how to use GC.KeepAlive in .Net

August 27th, 2011 1 comment

Let’s look on the following C# code example (ignore the correctness of the code and its logic)

    /// <summary>
    /// Indicates any service Logger for example
    /// </summary>
    class MyService
    {
        public MyService(string fileName)
        {
            //Do some initializations
        }

        public static void DoSomething()
        {
            //some calculations, or logs creation
        }
    }
    //*************************************************
    /// <summary>
    /// Usage example class 
    /// </summary>
    class MyLogic
    {
        public void Foo()
        {
            //cals static method of the initialized service
            MyService.DoSomething();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //Create our service 
            MyService myService = new MyService("temp.txt");
            //Wait here for user
            Console.ReadLine();
        }
    }

Read more…

Categories: .Net, GC Tags: ,

How to marshall C++ reference parameter to C#.NET using C++/CLI

May 11th, 2011 No comments

Suppose you have some very complicate function written in either C or native C++. And suppose you want to use it in your C#.NET managed code. Obviously, marshalling is required.
There are generally 3 possible options for marshalling:
1) COM
3) C++/CLI
2) Pinvoke (Platform Invokation)

Since making a COM wrapper for native code (ATL e.t.c) is not trivial, and C++/CLI is usually used for more complicated cases, most used way is platform invokation: define the function as “static extern”, add “DllImport” attribute, define some parameters and – eureka! – the required managed function is ready for using…
In case of native C++ class’s method, the process is a bit more complicated, because compiler concatenates a class & method names in some strange form. Still, the new method name could be acheived using known for all “Dependency Walker” application.

Read more…

Categories: .Net, C#, C++/CLI Tags: ,

How to extend Windows Phone 7 emulator’s functionality (unlock)

May 10th, 2011 2 comments

While programming to Windows Phone 7 (or another mobile device), very important instrument is the device’s emulator, integrated into development environment. Visual Studio 2010 supplies an emulator; while compiling & running our code (using either Silverlight or XNA technology), the emulator is running and creating an environment for our application. By the way, full Visual Studio 2010 is not must for development on WinPhone7; one can use a free environment “Microsoft Visual Studio 2010 Express” instead.

Read more…

Categories: Windows Phone 7 Tags: , ,

Getting OutOfMemory exception in .Net process, possible solutions.

May 7th, 2011 No comments

Getting OutOfMemoryexception in .Net process, possible solutions.

I want to share with you very interesting and complicated problem that we managed to overcome. I will describe all our resolution procedure step by step. Hope it will help others as it helped us, in any case I have learned a lot.

 

We have encountered a serious problem such as OutOfMemoryException

In my application – WinForm application i have managed code and un-managed (C/C++) 3’rd party code that perform many un-managed memory allocations at beginning of the process load and during runtime.

As we started to suffer from memory problems, we decided to enlarge address space that our process can use from 2 GB to 3 GB. This operation was done by using /LARGEADDRESSAWARE flag for our process and OS configured with /3GB. Unfortunately enlarge address space to our application seems to be good solution, but it didn’t help in our case.

So we started debugging and deeply investigate our Outofmemory problems. As usual main tool that we have used was WinDbg. Interesting things were discovered by using WinDbg and using following command “!address –summary” which shows us that we have not reached 3GB memory limit. Although that we have free memory, the memory wasn’t continuous so the CLR or native code failed to allocate memory. The problem appear to be defragmentation problem.

Read more…

Categories: .Net, C# Tags: , , , , ,

Working with System.Timers.Timer causing memory leaks

April 21st, 2011 2 comments

Short preamble,

Recently we had very serious problem with our application written in C#.NET; sometimes it has been completely stuck. This wasn’t easy reproducible scenario. As we started investigate the issue and debugging, more and more interesting things came up (not all code was written by our team, so debugging was not very easy thing). Memory almost wasn’t affected, but there was another symptom: thread count was growing and growing.

Finally the problem was discovered as following:
Read more…

Categories: .Net, C# Tags: , , ,

How to find all types which derive from given type.

April 16th, 2011 No comments

Suppose you need to find all types in assembly, which derive from given type (using C#.NET). What we need is reflection, to collect all types in a given assembly, using “Assembly.GetTypes” and then to select the required types only.

1) As a first attempt, we will use a function “IsSubclassOf” for every type in assembly:

public IEnumerable<Type> GetAllTypesDerivedFrom(Type type)
{
        var types = Assembly.GetAssembly(type).GetTypes();
        return types.Where(curType => curType.IsSubclassOf(type));
}

This works good. So, why this attempt is not a solution? Because the function “IsSubclassOf” works with classes, but not with interfaces. It returns “false” for interface.
Read more…

Categories: .Net, C# Tags: ,

How to do mapping of NCLOB into string in NHibernate

April 11th, 2011 2 comments

I want to describe some error, which is accepted, while mapping NCLOB in NHibernate.

Working with Oracle database, we use “NVARCHAR2” type for strings. But this type has a constrain: it could contain no more then 2000 characters. If one needs to store some long text in Oracle, he will use an NCLOB type.

But, while mapping this type, next error is accepted:
ORA-01461: can bind a LONG value only for insert into a LONG column“.

How can we avoid this error? Two ways are possible:

1) Setting coulumn’s type to “AnsiString”:

        <property name="Contents" column="CONTENTS" type="AnsiString"/> 

Read more…

Categories: .Net, NHibernate Tags: , , , , ,

A problem with using static member in a class C#.NET

April 9th, 2011 3 comments

Today, I would like to tell about some bug I had in my C#.NET code, and a simple way to fix it.

When needed a transform matrix 3 x 3, I wrote a simple class Matrix3X3; this class includes static feilds “Zero” and “Ones” for Zero-Matrix and Ones-Matrix appropriately.
Let’s take a brief look of the implementation:

class Matrix3X3
{
        public static Matrix3X3 Zero = new Matrix3X3(0);
        public static Matrix3X3 Ones = new Matrix3X3(1);

        // class members ...

        public Matrix3X3(double value)
        {
                // Fill the whole matrix with same value.
                // ...
        }

        // class methods ...
}

Read more…

Categories: .Net Tags: , , ,

Simple singleton pattern with inheritance in C#.NET (part 2)

March 13th, 2011 1 comment

In my previous post about singleton inheritance, I’ve presented a simple singleton design pattern implementation in C#.NET, and a more advance implementation method, which allows to inherit from base singleton class. In the curent post, I will show several ways, to make the singleton thread-safe.
While saying “thread-safe singleton”, one usually means the singleton creation; another functions/properties are handled regular way to be threadsafe. Singleton creation must take place only once.
Classic pattern, providing a solution for this issue, is double-checked locking. Why 2 checks are needed? Because, after the first time creation, the lock is redundant. So we just prevent it by additional check. Using this pattern, singleton creation looks like this:

Read more…

Categories: .Net, Design Tags: , , ,

Simple singleton pattern with inheritance in C#.NET (part 1)

March 12th, 2011 No comments

Singleton is very simple and widely used Design Pattern. This pattern is described in a lot of blogs, articles and books (e.g. GoF = Gang of Four). According to GoF,  singleton’s job is to “Ensure a class has one instance, and provide a global point of access to it”. In a general case, singleton can be extended, in order to ensure a class has n instances, while 1 ≤ n < ∞.

How can one build a singleton?

Two steps to make some class to be a singleton:
1) Forbid straightforword creation => let constructor be private (or protected in some cases).
2) Provide general access point => static property (or function), which allows an access to object.

Let’s see the code:

Read more…

Categories: .Net, Design Tags: , , ,

Janus GridEx customizable cell content

March 5th, 2011 No comments

Recently i had accomplished interesting task, which include to add time duration data to one of the existing Grids in our Winform desktop application. We are working with 3rdParty controls Janus (Janus.Windowa.GridEx).

Unfortunately not all our controls are WPF, so we still need to “struggle” WinForms to make any special changes in UI.

The problem was that our product manager wanted to make usage of the same visual column for different types of data – such as >int and System.TimeSpan. As you can see they have completely different presentation.
00:00:03.45334
After some thinking we have decided to add additional column of Type Syste.TimeSpan and make this column hidden to the end user.

MyColumns = m_gridControl.RootTable.Columns;
MyColumns["durationColumnName"].Visible = false;

Read more…

Categories: .Net, C# Tags: , ,

Bitmap construction from raw buffer in C#.NET

March 4th, 2011 No comments

Recently, I needed to get an image’s buffer from the network, and to store it in a file system.
If needed to work with image files, one can use a C#.NET “Bitmap” class, existing within “System.Drawing” namespace.

This class encapsulates a GDI+ bitmap and supports the next formats: BMP, PNG, JPG, GIF, TIFF and EXIF.
And it has a good API. It is very friendly class. After the object exists, saving appropriate file is a straight forward action:


Bitmap bitmap = ...
bitmap.Save("TargetImageFileName.bmp"); //format selection is possible

But, how the “Bitmap” object should be created from given buffer in memory?
Quick search in MSDN supplied the next solution:


Byte[] buffer = Proxy.GetImageBuffer();
ImageConverter converter = new ImageConverter();
Image image = (Image) converter.ConvertFrom(buffer);
Bitmap bitmap = new Bitmap(image);

// Work with the bitmap ...

This could be a great solution, but not in given case.
The ”ConvertFrom” function of  ”ImageConverter” is looking for image’s header. The buffer contains a pure raw data, and hence is decoded in a wrong way. As a result of memory corruption, ”ArgumentException” is thrown.

So, what is good solution?

In order to initialize “Bitmap” object from a raw data buffer, first we must supply image’s metadata. We must “teach” the Bitmap object about image, it is going to contain.


public Bitmap CreateBitmapFromRawDataBuffer(byte[] buffer)
{
        // Prepare required image's metadata.
        Size imageSize = new Size(300, 200); // Known size.
        PixelFormat imagePixelFormat = PixelFormat.Format16bppGrayScale; // Known type.

        // Set bitmap known image's metadata.
        Bitmap bitmap = new Bitmap(imageSize.Width, imageSize.Height, imagePixelFormat);

        // Prepare working rectangle.
        Rectangle wholeBitmap = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

        // Lock all bitmap's pixels.
        BitmapData bitmapData = bitmap.LockBits(wholeBitmap, ImageLockMode.WriteOnly, imagePixelFormat);

        // Copy the buffer into bitmapData.
        Marshal.Copy(buffer, 0, bitmapData.Scan0, buffer.Length);

        // Unlock  all bitmap's pixels.
        bitmap.UnlockBits(bitmapData);

        return bitmap;
}

That’s all. It works. Use carefully.

Categories: .Net Tags: ,

Using Debug.Assert while writing .Net code

March 3rd, 2011 No comments

Using Debug.Assert while writing .Net code

Today we have got new version of some product from other Team (component to retrieve data from DB). During our integration we have failed to run their code – got very strange errors ant etc.
Team which was responsible for this part of the project claimed that they checked everything and all functioning – but they did their tests only for Debug version of the Assemblies.

In .Net debug and release there shouldn’t be any difference in functionality Debug build version might be little bit slower. So we suspected in thread race problems and other weired stuff.

After several ours of debugging and phone calls with another team we have found the problem … it was really sad or funny to discover such simple mistake that developer can do.

See the following code:

public void DoSomething()
{

Debug.Assert(Foo());

}

public bool Foo()
{
//calculate something 
//set some data
}

command shown above is part of System.Diagnostics namespace useful for Debugging and making sure that code flow is working as designed by developer.
As you can see the problem in this code is that method called from Assertion. Very important not to call methods from Debuug.Assert this line of code will be removed by compiler during Release compilation.

The fixed code looks like this:
public void DoSomething()
{

bool res = Foo();

Debug.Assert(res);

}

public bool Foo()
{
//calculate something
//set some data

return sucsessFlag;

}
So the code flow doesn’t affected by the Assertion.
This looks small issue but believe me, very painful when it happening before version release :).

Categories: .Net Tags: ,