|
I've recently been playing with command line compiles of my C# projects. Beeing accustom to C and C++ I'm used to building all of my files into object code and then compiling all of hte object code together in the end. Looking around I thought that "csc /t:module" was the answer.
However i was very mistaken. Everything will compile with /t:module just fine and it willa ll apparently compile together at the end by using the /addmodule switch. However the resulting executable is still dependent upon the .netmodule files.
Is there any way to combine the .netmodule files into one assmebly so that it is no longer dependent upon all of these small little object files. My main intent here is to create incremental builds so that I'm not recompiling all of my classes at the same time. Any advice would be appreciated.
Jared
jparsons@jparsons.org
www.prism.gatech.edu/~gte477n
|
|
|
|
|
You can use alink (al.exe) to create an assembly from the modules.
I will warn you, however, that netmodules aren't supported in the IDE and aren't widely used.
csc already supports incremental compilation with the /incremental switch, which should meet your needs. If that's not fast enough - or you don't want to use it - I suggest you break your projects into multiple assemblies.
|
|
|
|
|
Eric Gunnerson (msft) wrote:
csc already supports incremental compilation with the /incremental switch, which should meet your needs. If that's not fast enough - or you don't want to use it - I suggest you break your projects into multiple assemblies.
This was actually what I was looking for. I don't know how I missed it in the documentation. Thanks.
Eric Gunnerson (msft) wrote:
You can use alink (al.exe) to create an assembly from the modules.
However doesn't this still maek the final .exe dependent upon the .netmodules?
Jared
jparsons@jparsons.org
www.prism.gatech.edu/~gte477n
|
|
|
|
|
jparsons wrote:
Eric Gunnerson (msft) wrote:
You can use alink (al.exe) to create an assembly from the modules.
However doesn't this still maek the final .exe dependent upon the .netmodules?
I don't think so. The only real dependencies in .NET are at the assembly level, and alink just grabs all the IL and metadata and creates an assembly from it.
|
|
|
|
|
Maybe I'm not being clear when I say dependent. What I mean by dependend is if Assembly A is dependent on netmodule B then B must be in the same directory as A to execute. Quick Example.
Test.cs
using System;
public class Test {
public void SayTest() { Console.WriteLine("Test"); }
}
Hello.cs
using System;
public class Hello {
public static void Main(String[] args) {
new Test().SayTest();
}
}
Now if I compile with the following lines.
$>csc /t:module Test.cs
$>csc /t:module /addmodule:Test.netmodule Hello.cs
$>al /main:Hello.Main /t:exe /out:Hello.exe Test.netmodule Hello.netmodule
$>Hello
Test
This works as expected. However if I delete the netmodules and try to run Hello again the microsoft debugger comes up. What I want is a way to add the modules completely so that their "netmodule" state is no longer needed.
Jared
jparsons@jparsons.org
www.prism.gatech.edu/~gte477n
|
|
|
|
|
I've done a bit more research, and found out that I was wrong about things work.
There isn't, as far as I can tell, a way to create an assembly from the netmodules that's identical to what you'd get if you went straight to an assembly.
|
|
|
|
|
I've seen a couple of applications that put Icons in the system tray and display text in the icon. Specifically I'm thinking of WeatherBug, which displays current temperature in the system tray. Is there a way to do that using c#? The NotifyIcon class has a Text property, but that controls what's displayed in the balloon, not text shown in the icon itself.
Thanks
|
|
|
|
|
sasdav wrote:
WeatherBug, which displays current temperature in the system tray
I would guess it is just usual icons that is shown in the system tray. You can't put text to the system tray (I think, I'm sure)... perhaps in XP, I don't know!
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
Yes. At least I think so.
I think what you'd need to do is create a new Image, get a Graphics object from it, draw to that Graphics object, and then save it out as an icon.
Then, open that file as an Icon instance and set the Icon property to that instance.
If you haven't written your app yet, I did a column on one last month. See http://www.gotdotnet.com/team/csharp
|
|
|
|
|
That's a good article, thanks for the link. But (you knew there would be a but, didn't you) I've already got an application that uses a static icon in the System Tray. I built a talking clock that tells me the time every so many minutes that I'm pretty proud of.
Do you have any more detail on adding text to the icon while the program is running?
By the way, you didn't happen to see my question about TAPI, did you? I haven't gotten a single reply on it.
Thanks again.
|
|
|
|
|
I'm not sure what extra detail you need. All you need to do is:
Image i = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(i);
g.DrawString(...);
g.Dispose();
i.Save("test.ico", ImageFormat.Icon);
Icon icon = new Icon("test.ico");
notifyIcon.Icon = icon;
As for the TAPI question, I don't know the answer.
|
|
|
|
|
Well, maybe it's not. This code:
Image i = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(i);
SolidBrush blackBrush = new SolidBrush(Color.Black);
g.DrawString("00",this.Font,blackBrush,new Point(0));
g.Dispose();
i.Save("test.ico",ImageFormat.Icon);
Icon icon = new Icon("test.ico");
notifyIcon.Icon = icon;
Generates this error:
System.ArgumentException: The argument 'picture' must be a picture that can be used as a Icon.
at System.Drawing.Icon.Initialize(Int32 width, Int32 height)
at System.Drawing.Icon..ctor(String fileName)
There is a file called test.ico being created, but when I load it into the icon editor it's just gibberish.
|
|
|
|
|
Another idea:
* When you create the bitmap, use the ImageFormat.Icon format. Create to a Bitmap rather than an Image,
* After you've done the drawing, use:
Icon icon = Icon.FromHandle(bitmap.GetHicon());
I *think* that should work; the docs from GetHicon imply that this should work. Please let me know.
|
|
|
|
|
Excellent! And it doesn't generate the test.ico file either. Thanks very much.
Here's the code I ended up with:
Bitmap i = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(i);
SolidBrush blackBrush = new SolidBrush(Color.Black);
g.DrawString("text",this.Font,blackBrush,new Point(0));
g.Dispose();
Icon icon = Icon.FromHandle(i.GetHicon());
notifyIcon.Icon = icon;
|
|
|
|
|
Hi all, just a small question:
What is the correct way to try-catch in foreach loop?
I have , and it seems to work OK, but it looks like it should break the loop, which we dont want.
try
{
foreach (MyClass myclass in anArrayList)
{
DoStuff();
}
}catch (System.InvalidCastException e) {}
Anyone?
READ MSDN
|
|
|
|
|
In the above code snippet it appears that you are wary about 'anArrayList' not containing classes that are or inherit from MyClass. Unfortunately the only way to get it to continue through the loop is to write the foreach code yourself.
IEnumerator ie = anArrayList.GetEnumerator();
while(ie.MoveNext())
{
MyClass myclass = ie.Current as MyClass;
if( myclass != null )
{
DoStuff();
}
else
{
}
} A bit uglier, but it allows you to avoid an exception and you can continue processing the loop.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
|
Yes, that is ok.
There is one problem you may run into; and that is if you want to actually execute DoStuff on instances of MyClass as well as instances of a class that inherits from MyClass.
The above technique also won't work with all interfaces because of the way that the GetType() method works in regard to them.
Both cases can be solved by using the is and as operators. Essentially (not what really happens but the effect is the same) the is operator returns true of the left operand can be cast to the right operand. The as operator casts the operand to the type of the right operand, but returns null if the cast cannot be performed. If is returns true, then as will not return null and vice versa.
public class MyClass {}
public interface IMyInterface {}
public class Foo : MyClass {}
public class Bar : MyInterface {}
public class Baz : MyClass, IMyInterface {}
...
MyClass mc;
Foo foo;
Bar bar;
Baz baz;
mc is MyClass == true
mc is IMyInterface == false
foo is MyClass == true
foo is IMyInterface == false
bar is MyClass == false
bar is IMyInterface == true
baz is MyClass == true
baz is IMyInterface == true To me the is and as operators are more versitile than simply comparing the Type returned from GetType()/typeof.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Thx, James
James T. Johnson wrote:
There is one problem you may run into; and that is if you want to actually execute DoStuff on instances of MyClass as well as instances of a class that inherits from MyClass.
Thats exactly what I ran into, but simplified the code when I posted (me bad).
So is / as should be used like:
class Player{}
class Dealer : Player {}
class Players : ArrayList {}
...
Players players = new Players();
void Method()
{
foreach (Player player in players)
{
if (player is Dealer)
{
Dealer dealer = player as Dealer;
dealer.DoDealerStuff();
}
}
}
Seems to make alot more sense after writing it myself, dunno if the post is neccesary, but its here now Submit shall be clicked .
MYrc : A .NET IRC client with C# Plugin Capabilities. See
http://sourceforge.net/projects/myrc for more info.
|
|
|
|
|
Yep, you got it!
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|
|
Tad bit nitpicky but this code could be a little bit faster.
<br />
if (player is Dealer) <br />
{ <br />
Dealer dealer = player as Dealer; <br />
dealer.DoDealerStuff(); <br />
}<br />
In this code the CLR must determine the type of player twice. The first time it will check when you call "player is Dealer". Then it has to check again which you do player as Dealer. It would be slightly more efficient to write it this way.
<br />
Dealer dealer = player as Dealer;<br />
if ( dealer != null ) {<br />
dealer.DoStuff();<br />
}<br />
Jared
jparsons@jparsons.org
www.prism.gatech.edu/~gte477n
|
|
|
|
|
|
I am creating a custom control called DropDownGroup that is similar to the functionality found in the main screen of Money 2002 (its basically a GroupBox that has a minimize and hide button in the header area).
I managed to create a functional version that inherits from Control that does all of its painting in OnPaint, and overrides DisplayRectangle so that a fully-docked child control will not cover the header area. However, just overriding DisplayRectangle doesn't disallow an undocked child control from being positioned on the header area (the GroupBox control has this unwanted feature as well).
To try and remedy this I decided to paint my header in the non-client area of the control. I overrode WndProc and intercepted WM_NCCALCSIZE, WM_HITTEST, WM_NCPAINT, and the WM_NC mouse messages. My WM_NCCALCSIZE handler modifies the client rectangle so that I have room for my header at the top. The WM_HITTEST handler returns a value for the caption or the client area. I paint my header in response to WM_NCPAINT, and I use the NC mouse messages in place of the OnMouse... handlers...
Everything was working fine (I have a custom designer class for the control, and when you try to drag a child to the header area it displays the 'no' icon just like with the title bar of a Form), except my buttons (not controls, just drawn ones) were not highlighting in response to the WM_NCMOUSEMOVE message when the cursor was over them. The functionality worked in that everything responded to the WM_NC button messages as expected. I just couldn't get the non-client area to redraw. I've tried a ton of things (sending WM_NCPAINTs, WM_PAINTs, and calling Invalidate, in various orders) but nothing seems to work.
Does anyone know how to get the non-client area of a Windows.Forms Control to repaint itself?
Why does sending WM_NCPAINT not actually cause a repaint of the non-client area (my WM_NCPAINT handler gets called and does its work, but nothing changes on the display)?
I have the ControlStyles AllPaintingInWmPaint, DoubleBuffer, and UserPaint all set. Could that be affecting it (by my testing it doesn't seem to since I've tried all combinations of the three)?
Thanks in advance for any help or guidance.
|
|
|
|
|
I need a control similar to the Property Grid, but that I can use without an object. I would like to set my own "properties" with code and be able to retrieve what the user entered.
Short of writing my own (which I don't have time, this is an urgent project), does anybody have an idea??
-- LuisR
──────────────
Luis Alonso Ramos
Chihuahua, Mexico
www.luisalonsoramos.com
"Do not worry about your difficulties in mathematics, I assure you that mine are greater." -- Albert Einstein
|
|
|
|
|
You could use the Reflection.Emit API to create classes at runtime.
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|