|
Hi all!
I'd like to make one of my c# apps a COM server and don't have a good idea on how to do it.
Creating a .NET dll containing a COM-visible class and calling this class from a COM client is easy and works fine, but so far I couldn't find a way to do this for a .NET executable.
When I set the output type to windows executable, the "Register for COM interop" flag is not honored.
Calling regasm works for the dll as well as the exe, though.
Instantiating a class in a COM client does work as long as the dll is registered. When I build the exe, call regasm and re-run the same COM client (a simple VBScript) I get the error 0x80070002 (file not found) when calling CreateObject().
Any idea/advise?
Thanks in advance,
mav
|
|
|
|
|
It may be possible to correct the 0x80070002 error by manually editing the registry key to use ".exe" instead of ".dll", which is likely written in by the .NET Framework during registration. However, if the framework does that, it may have issues trying to run a .exe as a COM server?
Anyway, why do you need the EXE instead of a DLL? Explain that, and we may be able to offer a better solution, while still using a dll.
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
Thanks, John, for taking your time!
I want an EXE because I already have an executable (a Windows Forms Application) that I want to enrich by making it a COM server.
The goal is to make methods/properties of the running instance of the application visible to COM...
Perhaps I could move all the functionality into a class library and only put the startup code into the exe itself, but then I guess I'll get a new instance of my form class when I instantiate a COM object from the class library and cannot access the running form itself.
Thanks in advance for anything you can come up with.
Regards,
mav
|
|
|
|
|
I want to be careful about my advice here. I'm not sure whether you can't do what you want with a .NET exe. However, there are some other options, if that truly doesn't work.
1.) Create a COM server in unmanaged code, but it simple passes off the work to the .exe that you have already written. (Not as much work as re-writing, but still a bit of work, I bet. You'll have to figure out how the communication would take place.)
2.) Use one or more of the different ways that you can operate multiple dll instances as if they were one shared instance (or actually share the same dll). One of the ways to handle this is with shared memory mapped files, and named events.
3.) Create an unmanaged COM server exe, and make it actually contain (wrap) your existing application. (Managed C++ would work well for this, I think.)
4.) Don't forget that you may still be able to make the .exe into a COM server.
5.) A re-think of #2 is that you could make a dll COM server, that uses sockets or interprocess communication to communicate with the .exe that you want to really use. That way, you could have multiple instances of the COM object, but they would all be communicating with the single exe, acting as one instance.
6.) Brainstorm a bit more!
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
Can somebody tell me how I can insert text from TextBox-es to DataGrid using C# and (InsertCommand) dhe (UpdateCommand) same time deleting from DataGrid (DeleteCommand)
HElp!!!
|
|
|
|
|
hi,
You can Update dataGrid Like this:
DataSet ds=new DataSet();
System.Data.SqlClient.SqlDataAdapter ada,dt1;
ada=Get data for adapter object
ada.Fill(ds);
this.dataGrid1.DataSource=ds.Tables[0].DefaultView;
System.Data.SqlClient.SqlCommandBuilder sqlcom=new SqlCommandBuilder(ada);
dt1=sqlcom.DataAdapter;
//Update changes in the datagrid
DataTable tt=ds.Tables[0].GetChanges();
dt1.Update(ds);
regards ,
pubudu.
|
|
|
|
|
Insert into the DataSource and Refresh() on the DataGrid
|
|
|
|
|
MY program is supposed to send a file asychronously via TCP and sockets, to this end i grab
chunks of the file and store it in a data class, which i serialize and send.This is then
deserialized and the data block is placed in the correct spot in the file by offseting the
stream to the appropriate spot.
ok to the error , this process works the first couple of types with atleast the first 2
chunks of data being recieved and placed in a file on the other side. However after that
things go pear shaped, as once one goes wrong all the remaining chunks no longer work all
giving similar errors.
1 //<< this is my sequence number i use to find offset values
0 //<< current offset in file
got to reciever
got to tryrec
2 //<< this is my sequence number i use to find offset values
1024 //<< current offset in file
got to reciever
got to tryrec
A Exception occured in file transferSystem.Runtime.Serialization.SerializationException: The
input stream is not a valid binary format. The starting contents (in bytes) are:
6C-65-2E-52-65-61-64-4C-69-6E-65-28-29-3B-0D-0A-0D ...
at
System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser
input)
at
System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord(
)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler
handler, __BinaryParser serParser, Boolean fCheck, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream
serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage
methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream
serializationStream)
at SocketSystem.Program.MessageHandlerServer(CSocketClient pSocket, Int32 iNumberOfBytes)
in c:\documents and
settings\rob\desktop\socketsystem\socketsystem\socketsystem\program.cs:line 274
got to reciever
my data class
[Serializable]<br />
public class DropBear<br />
{<br />
public int SequenceNo = 0;<br />
public string misc = "";<br />
public byte[] buff = null;<br />
<br />
}
---------------------------------------------------------------------------
now for my serialization code
DropBear db = new DropBear();<br />
db.buff = buffered;<br />
db.SequenceNo = filt.currSeqNO++;<br />
BinaryFormatter bf = new BinaryFormatter();<br />
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, db);
Byte[] by = ms.GetBuffer();
//data sent as Byte[] << byte buffer size 10240
//file chunk 1024
----------------------------------------------------------------------------
Deserialization
MemoryStream s = new MemoryStream();<br />
s.Write(pSocket.GetRawBuffer, 0, pSocket.GetRawBuffer.Length);<br />
BinaryFormatter bf = new BinaryFormatter();<br />
s.Position = 0;<br />
DropBear db = (DropBear)bf.Deserialize(s);
-------------------------------------------------------------------
the data is sent with a network stream, i have tryed resetting the buffer at the end of
every read and before every recieve
Any input would be appreciated.
Thanks Rob
|
|
|
|
|
Before reading from the MemoryStream do
ms.Seek(0, SeekOrigin.Begin);
I was getting similar errors. This solved the problem.
|
|
|
|
|
i have a MainForm that act as a MDI container, i load the company logo as backgroundimage, but the image is load as tile mode which fill all the MDI container, is there anyway to set the background image to the center of the MDI container instead of tile?
|
|
|
|
|
the way out is little tricky...
Add another form in your application. Add picture box on it. Assign image in it. then come to your main MDI Form. and in class Declaration inherit it with this new form. and your job is done..
hope this helps
|
|
|
|
|
There is one more trick,
Form f = new Form();
Panel p = new Panel()
f.Controls.Add(p);
p.Dock = DockStyle.Fill;
p.BackGroundImage = //your image
p.BackgroundImageLayout = ImageLayout.Center;
This will work only in VS.NET 2005.
Thanks,
Alomgir
|
|
|
|
|
U could, handling the paint events of the MdiClient control. But isnt easier to just use the designer to drop a picturebox with the logo where u want it instead of using background images?
Maybe I misunderstood ur question.
|
|
|
|
|
hey all,
i have the following code
<code>
public class CustomObjectCollection : CollectionBase
{
...
public int ContainsName(string name)
{
for (int i=0; i<this.Count; i++)
{
if (this[i].Name.Equals(name) { return i; }
}
return -1;
}
...
}
</code>
is there a better way of doing that?
Kids don't try this at home!
|
|
|
|
|
Hi,
I dont see anything wrong with your code.
Seems to be perfect.
Thanks,
Alamgir
|
|
|
|
|
If I get a return from a XML web service, like this : <value>12</value> . How do I retrieve the value using XMLDocument? Thank you for your answer.
<italic>Work hard, Work effectively.
|
|
|
|
|
What do you mean you return 12?
/\ |_ E X E GG
|
|
|
|
|
I forgot. Sorry. Here:
If I get a return from a XML web service, like this : <value>12</value>. How do I retrieve the value using XMLDocument? Thank you for your answer.
<hr><italic><small>Work hard, Work effectively. </small></italic>
|
|
|
|
|
assuming you already have this xml loaded into a XmlDocument (doc) instance.
Can you show me your whole xml file hierarchy? I need it to show you a better example.... Here's what I can show you now...
XmlNode node=doc.SelectSingleNode(xpath...);
string alexEggRules=node.InnerText;
and alexEggRules will have "12" in it...
/\ |_ E X E GG
|
|
|
|
|
<NewDataSet>
<Table>
<Country>Indonesia</Country>
<City>Ujung Pandang / Hasanuddin</City>
</Table>
</NewDataSet>
Thanks Alex.
|
|
|
|
|
ok. Well now I don't know what node you want. So well just say we want the value of the Country node. Also, I'm assuming that the xml will only contain one instance of the node, so I'm using SelectSingleNode, if there are more then one instance, you should use SelectNodes.
So we have our XmlDocument doc, which has the below xml in it, and we are going to get the value of Country.
XmlNode node=doc.SelectSingleNode("//NewDataSet/table/Country");
string country=node.InnerText;
and that's it. If you have more then one instance of table or NewDataSet, we need to use a XmlNodeList instead of an XmlNode and SelectNodes instead of SelectSingleNode. Once we have the XmlNodeList, we can iterate through it with a foreach.
XmlNodeList nodes=doc.SelectNodes("//NewDataSet/table/Country");
string [] country=new string[nodes.Count];
int i=-1;
foreach(XmlNode node in nodes)
{
country [i++] =node.InnerText;
}
Any questions?
<NewDataSet>
<table>
<Country>Indonesia</Country>
<City>Ujung Pandang / Hasanuddin</City>
</table>
</NewDataSet>
/\ |_ E X E GG
|
|
|
|
|
eggie5 wrote:
Any questions?
Nope. I got it very clear. Thank you very much.
<italic>Work hard, Work effectively.
|
|
|
|
|
I have awindows application in C#.net. I made a patient Object. It has some variables like firstName. I declared this variable as private and made propeety FirstName. Is it good to put validation in the set method of property. If yes then suppose a FirstName on the form is empty and we click on add button to save the record. then a new object is created for patient but it will give a message of empty firstname when we assign the textbox value of the form to it. But after giving message i want to stop any further processing and set the focus to firstname textbox . How can i do that. Presently it continues with the other variables and create a object in the end.
Thanks
Monica
|
|
|
|
|
monica2k wrote:
Is it good to put validation in the set method of property.
No. Validation should be a completely separate method. The property should simply return the field value or set it.
To do validation, take a look at the Validated and Validating events that are part of every control. These explain how the validation works with response to the control losing focus--meaning, a value has been entered and the user tabs off the control or selects a different control.
Of course, it's a flawed system. Selecting a menu item does not cause a control to lose focus.
Marc
My website
Latest Articles:
Undo/Redo Buffer
Memento Design Pattern
|
|
|
|
|
This is probably a newbie question, but I can't find any info on how this works.
I'm creating a VS project file for ICSharpCode's TextEditor, and it wants to read some data using GetManifestResourceStream:
assembly.GetManifestResourceStream("SyntaxModes.xml");
While I have the individual files, I haven't a clue how to actually create the resource file. I tried Lutz Roeder's resourcer, so now I have a resx file with all these xml files in it, but that didn't work.
Any pointers or links to sites that explain how to do this?
Thanks!
Marc
My website
Latest Articles:
Undo/Redo Buffer
Memento Design Pattern
|
|
|
|