|
You Wrote :when I want to run the program on different computer, I need to copy the dlls I called, to the same directory Where the .Exe resists.
No. Each and every Windows operating system contain this Win32.dll file (excluding Windows 95. I think here it is Win16.dll) in it's System32 directory. So you don't want to copy the calling .dll. Refer using DllImport Attribute. Hope you understood.Please see that url that i attached in my last thread.
Sreejith Nair
[ My Articles ]
|
|
|
|
|
sreejith ss nair wrote:
So you don't want to copy the calling .dll.
Hi.
I DO want to copy the dll, since it isn't a windows dll. it's a dll of some third party API. The program doesn't load without the dll in the running directory.
I'll repeat my problem to make it clear.
I use an external Win32 (i.e. not .Net) dll which contains function foo(). The dll isn't part of Windows. I'm afraid that somebody will place in the folder a dll with the same name, that contains some malicious function foo(), who do some evil job before he calls in turn to the original foo().
I thought I can avoid this, if I find a way to embed the called dll in my application.
I'm open to another suggestion or information.
Thanks for your help.
|
|
|
|
|
|
There is no way to do this. Even if you packaged the .DLL into a resource in your .EXE, you'd still have to unpack it, save the .DLL file to the folder where your app is installed, and then call it.
But, someone that malicious could also just put a replacement .DLL into the folder where your app is installed, either tag it ReadOnly, or some other methdo to keep your app from putting the .DLL down successfully, whatever, and then your app would still call the bad .DLL.
The only method you can use to validate the .DLL is to run some kind of checksum, or some other file validation, on the .DLL file before you call it. But this is no way guarantees that the file your looking at is legitimate and it will also keep your application tied to a specific version of the .DLL file.
But this is a calculated risk that EVERY Windows application takes. There is just no reliable way to do this with a Win32 .DLL. Every Win32 .DLL can be impostered by a custom written replacement, using the same signatures and GUID's as your .DLL.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave Kreskowiak wrote:
...the same signatures and GUID's as your .DLL.
Thanks for making things clear.
How can I get the GUID and the signature?
Yaakov
|
|
|
|
|
The GUIDs are scattered abou in the registry. You'll need to search for the object names exposed by the .DLL in order to find them. The function signatures cannot be had unless you have the source code for the .DLL.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Thanks for your answer.
And here is another one which related to the previous.
I looked for the Al.exe documentation in the MSDN, and it explains the /link argument:
/link[resource]:file[,name[,target[,private]]]
Links a resource file to an assembly. The resource specified by file becomes part of the assembly; the file is not copied. The file parameter can be in any file format. For example, you can specify a native DLL as the file parameter. This will make the native DLL part of the assembly so that it can be installed into the global assembly cache and accessed from managed code in the assembly.
Isn't that what I was looking for?
However, I tried this, and I get the message: /link:... option not recognized.
Yaakov
|
|
|
|
|
Interesting. But I have no clue how you're going to access the .DLL inside the assembly. Also, if your .DLL is a COM component and must be registered, I have no idea how you're going to get that accomplished while it's sitting inside a .NET assembly.
It's just never been a requirement for me. If someone is going to do something malicious with my code, they're going to succeed weather I want them to or not. It's just up to that persons determination.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I'm writing a custom web component with a custom collection class. Today, I sat down to work, dragged a copy of the component from my toolbox onto a webform and discovered the error, "Parser Error: Ambiguous match found". I found a KB(http://support.microsoft.com/?kbid=823194[^]) article on it, but it didn't help at all. The compiler just says "<namespace> does not contain a definition for 'ObjectString'.
I'm scoured the internet, but no to avail. If you could help, it would be much appreciated.
|
|
|
|
|
Hi guys,
I am making windows application using C# which used a number of dll library files.
But, it cannot run in every computer, it says that "the class is not registered" or something like that.
I'm also tried to use GACUTIL.EXE / i [dll file]
But it give me another error message :
"Failure adding assembly to the cache: Attempt to install an assembly without a strong name"
It give me the same result when I use regsvr32.
Is anyone know how to solve it?
Thanks be4
|
|
|
|
|
You wrote
I am making windows application using C# which used a number of dll library files.
But, it cannot run in every computer, it says that "the class is not registered" or something like that.
Here i am little confused. Reason is the matter of registeration. Tell me how you are refering those assemblies in your application. ?
You wrote
"Failure adding assembly to the cache: Attempt to install an assembly without a strong name"
This error is cause, there is no strong name in your assembly which you are trying to install into GAC. What you can do is, use sn.exe tool to create a .snk file( Strong Name Key File). And refer this file name and location in your actuall assembly which you are trying to install into GAC.
Sreejith Nair
[ My Articles ]
|
|
|
|
|
It works!!!
Thank you very much
|
|
|
|
|
If I set page up/down/left/right margins to 0, some part of the page doesn't get printed. It seems printer has got certail default minimum page margin settings, that decides printable area on given paper, can we read them using WMI or by any other means?
Please guide.
|
|
|
|
|
Hi,
I've found the Enviroment.TickCount property, but i'm baffled as to how to use it to calculate cycles per second. I'm trying to optimise a number of sections of code, and i understand taking the final TickCount minus the initial TickCount, but i'm not sure how many ticks per second my CPU does so I can't really get a real world value for this. Any ideas?
Is there any way to calculate this?
Cheers
Tris
|
|
|
|
|
|
But, one Tick is a single Clock Cycle on the CPU. So it can't be fixed. You're running a 10khz cpu?
I mean, it's obvious if you know the clock frequency of the CPU, but there has to be some way to figure it out, without doing
int start = Enviroment.TickCount;
Thread.Sleep(TimeSpan.FromSeconds(1));
int finish = Enviroment.TickCount;
MessageBox.Show("Ticks Per Second: " + (finish - start).ToString());
Cheers
Cata
|
|
|
|
|
The Catalyst wrote:
But, one Tick is a single Clock Cycle on the CPU
No, it's not. One Tick, defined in the .NET Framework, is 100 nanoseconds, see this[^] for the definition.
There is no counter anywhere in the .NET BCL that counts the number of CPU clock cycles that have elapsed.
Also, TickCount does not have a high enough resolution to perform the measurement you want. It's accuracy is limited to 500 milliseconds at best.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
The Catalyst wrote:
I'm trying to optimise a number of sections of code,
It's a futile and frustrating attempt doing this without a profiler. JIT times, GC, and several other factors will make you insane, specially since you're counting "clock cycles". Try Devpartner free profiler or some other profiler and keep your sanity.
Yes, even I am blogging now!
|
|
|
|
|
Friends I have a problem about that I want make a mirror print from c# but I don´t know and I´ve found about this and not appear nothing,sorry for my english ,is bad but I hope that uds understand me and please help me!!!.I need this ,is important.
Thanks
S.
karel
I know of all but master of nothing
|
|
|
|
|
you want to print a text string in reverse is that what your trying to do?
|
|
|
|
|
yes but I want to print all the document in reverse ,look my printer hp3700dn make this but I want make it from the code,i need for my aplication,you know how?
S.
bigmega
|
|
|
|
|
I've got a smart client app in which the server return lots of objects to the client. Each object is constructed of lots of primitive data (a few Int64s, strings, etc), plus a few generic collections.
My question is, what is the best way to return data read on the server to the client? I see 2 options:
Option #1: I could create the objects on the server and pass them to the client:
ComplexObject ReadData()
{
return new ComplexObject(string, int, float, string, long, ...);
}
ComplexObject obj = Server.ReadData();
Option #2: I could pass the raw data from the server to the client, and the client could create the object on his side:
struct RawData
{
string str, name, text;
float blah, test;
long someLong, ID;
}
RawData ReadData()
{
return new RawData(str, name, text, blah, test, someLong, ID);
}
RawData data = Server.ReadData();
ComplexObject object = new ComplexObject(data.ID, data.text, data.name, ...);
Currently I'm using something like option #2, passing a lightweight struct back to the client, and have the client create the complex objects. Is there a better way?
Any remotely useful information on my blog will be removed immediately. There are 10 kinds of people in the world. Those who have heard of the ubiquitous, overused, worn-out-like-an-old-shoe binary "joke" and those who haven't.
Judah Himango
|
|
|
|
|
You could do your return in both ways, but in your first exemple if you say that the data quantum is large then the traffic caused by the app will be larger, thought, if you create the complex object onto the swerver your client will have less processing (work) to do.
Any other way I don't think there is
I hope you understand...
By the way... visit http://nehe.gamedev.net[^]
|
|
|
|
|
Well I've guessed that the 2nd option (passing raw data over the network, creating complex object on the client) is less network-intensive and therefore faster.
However, I'm worried that my light-weight struct that I use to pass the data over the network is too large for a typical struct. I know Microsoft has suggested that structs be no larger than 16 bytes of data; the structure I'm using to hold the data is much larger than 16 bytes (currently, 13 strings, 10 longs, 2 bools, and 10 DateTimes).
Anyone know of the most efficient way to transport lots of objects from server to client?
Any remotely useful information on my blog will be removed immediately. There are 10 kinds of people in the world. Those who have heard of the ubiquitous, overused, worn-out-like-an-old-shoe binary "joke" and those who haven't.
Judah Himango
|
|
|
|
|
|