Console App Display DLL logging info

Hello

I've got a C# console app, that calls a startup function in a C# dll that I 
have created.  In my DLL, as I'm processing data, I want to display some 
logging information, but I want to pass it back to the console app, and have 
it write the text to the console as it comes from the DLL, but I'm not sure 
how I should do this....

Any suggestions, example


Thanks 


0
Bill
7/1/2010 4:49:48 PM
dotnet.languages.csharp 1931 articles. 0 followers. Follow

12 Replies
923 Views

Similar Articles

[PageSpeed] 21

Bill wrote:
> Hello
> 
> I've got a C# console app, that calls a startup function in a C# dll that I 
> have created.  In my DLL, as I'm processing data, I want to display some 
> logging information, but I want to pass it back to the console app, and have 
> it write the text to the console as it comes from the DLL, but I'm not sure 
> how I should do this....

Do you want to pass it back to the console application?  Or do you want 
the text to show up in the console?  If you are passing the text to the 
application, you cannot enforce any rule that it has to then show the 
text in the console.  On the other hand, if you always want the text to 
go to the console, you can just call the Console.WriteLine() method 
directly (or similar).

My preference would be for a DLL to not be printing stuff to the console 
unless that's specifically the point of the DLL.  If you have a more 
general desire to provide a mechanism for logging/diagnostic information 
to flow from the DLL, it would be better to have the client code (the 
application itself) pass an instance of TextWriter to the DLL, which the 
DLL can then use to write output.

If the client code wants console output, it can just pass the value of 
Console.Out.  Otherwise, it can provide its own TextWriter and consume 
the output however it wants.

Pete
0
Peter
7/1/2010 5:22:12 PM
The DLL, isn't going to actually do the printing to a console window, 
instead it should pass text strings back to the calling app, and then the 
calling app would print the string to the console window.


"Peter Duniho" <NpOeStPeAdM@NnOwSlPiAnMk.com> wrote in message 
news:oYKdnQlsXvZYU7HRnZ2dnUVZ_o-dnZ2d@posted.palinacquisition...
> Bill wrote:
>> Hello
>>
>> I've got a C# console app, that calls a startup function in a C# dll that 
>> I have created.  In my DLL, as I'm processing data, I want to display 
>> some logging information, but I want to pass it back to the console app, 
>> and have it write the text to the console as it comes from the DLL, but 
>> I'm not sure how I should do this....
>
> Do you want to pass it back to the console application?  Or do you want 
> the text to show up in the console?  If you are passing the text to the 
> application, you cannot enforce any rule that it has to then show the text 
> in the console.  On the other hand, if you always want the text to go to 
> the console, you can just call the Console.WriteLine() method directly (or 
> similar).
>
> My preference would be for a DLL to not be printing stuff to the console 
> unless that's specifically the point of the DLL.  If you have a more 
> general desire to provide a mechanism for logging/diagnostic information 
> to flow from the DLL, it would be better to have the client code (the 
> application itself) pass an instance of TextWriter to the DLL, which the 
> DLL can then use to write output.
>
> If the client code wants console output, it can just pass the value of 
> Console.Out.  Otherwise, it can provide its own TextWriter and consume the 
> output however it wants.
>
> Pete 


0
Bill
7/1/2010 5:29:58 PM
Bill wrote:
> The DLL, isn't going to actually do the printing to a console window, 
> instead it should pass text strings back to the calling app, and then the 
> calling app would print the string to the console window.

Then just have the calling app pass a TextWriter instance.  If the 
calling app wants the text to go to the console, they can just pass the 
value of Console.Out, as I mentioned before.

Pete
0
Peter
7/1/2010 6:15:03 PM
Bill wrote:
> Hello
> 
> I've got a C# console app, that calls a startup function in a C# dll that I 
> have created.  In my DLL, as I'm processing data, I want to display some 
> logging information, but I want to pass it back to the console app, and have 
> it write the text to the console as it comes from the DLL, but I'm not sure 
> how I should do this....
> 
> Any suggestions, example
> 
> 
> Thanks 
> 
> 

You're easiest option would be to make a public object with get/set for 
string value and pass the object between the console app and the dll. 
You would instantiate the object in the console app and send it (by ref) 
to the dll.

You come out of the dll back to the console app and print what's in the 
object's string property.
0
Mr
7/1/2010 6:33:56 PM
Mr. Arnold wrote:
> Bill wrote:
>> Hello
>>
>> I've got a C# console app, that calls a startup function in a C# dll 
>> that I have created.  In my DLL, as I'm processing data, I want to 
>> display some logging information, but I want to pass it back to the 
>> console app, and have it write the text to the console as it comes 
>> from the DLL, but I'm not sure how I should do this....
> 
> You're easiest option would be to make a public object with get/set for 
> string value and pass the object between the console app and the dll. 
> You would instantiate the object in the console app and send it (by ref) 
> to the dll.
> 
> You come out of the dll back to the console app and print what's in the 
> object's string property.

Assuming the use scenario is exactly as above (object is simply a 
container for a string object), how is that better than simply returning 
a string object from a method?  Or passing a string variable 
by-reference (i.e. with "out")?

I take the original question as wanting something more dynamic.  That 
is, not just a simple transactional "DLL does X, client code than gets 
string it prints", but rather a more general mechanism by which the DLL 
can arbitrarily send strings back to the client code.

But if the OP is looking for a transactional approach, wrapping a string 
in an object when a simple method return value or by-reference argument 
would do seems like overkill to me.

Pete
0
Peter
7/1/2010 7:28:48 PM
I just setup a delegate in my DLL, then in my calling console app, I create 
an instance of the delgete, and pass that into the constructor of the class 
in the DLL, and assign it to a this.del where del is of delegate type.

In my console application I've got a function that prints out the strings.

Not sure if it is the best way to go, but it works

"Peter Duniho" <NpOeStPeAdM@NnOwSlPiAnMk.com> wrote in message 
news:0ZqdnTvGlcftcbHRnZ2dnUVZ_vqdnZ2d@posted.palinacquisition...
> Mr. Arnold wrote:
>> Bill wrote:
>>> Hello
>>>
>>> I've got a C# console app, that calls a startup function in a C# dll 
>>> that I have created.  In my DLL, as I'm processing data, I want to 
>>> display some logging information, but I want to pass it back to the 
>>> console app, and have it write the text to the console as it comes from 
>>> the DLL, but I'm not sure how I should do this....
>>
>> You're easiest option would be to make a public object with get/set for 
>> string value and pass the object between the console app and the dll. You 
>> would instantiate the object in the console app and send it (by ref) to 
>> the dll.
>>
>> You come out of the dll back to the console app and print what's in the 
>> object's string property.
>
> Assuming the use scenario is exactly as above (object is simply a 
> container for a string object), how is that better than simply returning a 
> string object from a method?  Or passing a string variable by-reference 
> (i.e. with "out")?
>
> I take the original question as wanting something more dynamic.  That is, 
> not just a simple transactional "DLL does X, client code than gets string 
> it prints", but rather a more general mechanism by which the DLL can 
> arbitrarily send strings back to the client code.
>
> But if the OP is looking for a transactional approach, wrapping a string 
> in an object when a simple method return value or by-reference argument 
> would do seems like overkill to me.
>
> Pete 


0
Bill
7/1/2010 8:53:32 PM
Bill wrote:
> I just setup a delegate in my DLL, then in my calling console app, I create 
> an instance of the delgete, and pass that into the constructor of the class 
> in the DLL, and assign it to a this.del where del is of delegate type.
> 
> In my console application I've got a function that prints out the strings.
> 
> Not sure if it is the best way to go, but it works

If you expect the common use case to be the client code calling 
Console.WriteLine(), then the approach I suggested is simpler and more 
appropriate.

But a callback mechanism is fine too, and may be more appropriate if a) 
your DLL always is returning individual strings, one at a time, without 
regard to console formatting, and b) you expect to have to use this 
implementation outside the context of the Console class on a regular basis.

Pete
0
Peter
7/1/2010 9:09:09 PM
Bill wrote:
> I just setup a delegate in my DLL, then in my calling console app, I create 
> an instance of the delgete, and pass that into the constructor of the class 
> in the DLL, and assign it to a this.del where del is of delegate type.
> 
> In my console application I've got a function that prints out the strings.
> 
> Not sure if it is the best way to go, but it works
> 
> "Peter Duniho" <NpOeStPeAdM@NnOwSlPiAnMk.com> wrote in message 
> news:0ZqdnTvGlcftcbHRnZ2dnUVZ_vqdnZ2d@posted.palinacquisition...
>> Mr. Arnold wrote:
>>> Bill wrote:
>>>> Hello
>>>>
>>>> I've got a C# console app, that calls a startup function in a C# dll 
>>>> that I have created.  In my DLL, as I'm processing data, I want to 
>>>> display some logging information, but I want to pass it back to the 
>>>> console app, and have it write the text to the console as it comes from 
>>>> the DLL, but I'm not sure how I should do this....
>>> You're easiest option would be to make a public object with get/set for 
>>> string value and pass the object between the console app and the dll. You 
>>> would instantiate the object in the console app and send it (by ref) to 
>>> the dll.
>>>
>>> You come out of the dll back to the console app and print what's in the 
>>> object's string property.
>> Assuming the use scenario is exactly as above (object is simply a 
>> container for a string object), how is that better than simply returning a 
>> string object from a method?  Or passing a string variable by-reference 
>> (i.e. with "out")?

What -- you think it's about something being better? All I provided was 
a simple solution no more or no less.


I don't need you in my face about it.
0
Mr
7/1/2010 9:12:16 PM
"Bill" <someplace@somewhere.com> wrote in message 
news:Op5z59VGLHA.1996@TK2MSFTNGP06.phx.gbl...
>I just setup a delegate in my DLL, then in my calling console app, I create 
>an instance of the delgete, and pass that into the constructor of the class 
>in the DLL, and assign it to a this.del where del is of delegate type.
>
> In my console application I've got a function that prints out the strings.
>
> Not sure if it is the best way to go, but it works


Oh, my post was not directed it at you. I can't see the other person. I 
don't know why I can't see his posts nor do I care, and that's using two 
readers. 

0
Mr
7/1/2010 9:20:55 PM
Mr. Arnold wrote:
> [...]
>>> Assuming the use scenario is exactly as above (object is simply a 
>>> container for a string object), how is that better than simply 
>>> returning a string object from a method?  Or passing a string 
>>> variable by-reference (i.e. with "out")?
> 
> What -- you think it's about something being better? All I provided was 
> a simple solution no more or no less.
> 
> I don't need you in my face about it.

I'm not in your face.  I'm asking a simple question, with the assumption 
that since you proposed the solution, you may have some valid reason for 
preferring it over some other approach.

I can understand why, if you don't actually have a good answer for the 
question, you might be so embarrassed that you wind up reacting so 
negatively.  But otherwise, you might consider just answering the 
question rather than wandering around with that chip on your shoulder.

As for whether "it's about something being better", well�personally, I 
try my best to provide the _best_ solution, not just _a_ solution.  I 
admit I don't always meet that goal, but I do try, and I'm not offended 
if somehow someone reveals to me, even in an oblique way, that I've failed.

Assuming some solutions are in fact better than others (and they aren't 
always), why not choose the one that's best?  And what's wrong with a 
calm, rational discussion about why one solution might be better than 
another?

Try to not take things so personally.  It's not about you.  It's simply 
about finding the best answers for questions people ask.  If you can't 
let go of your ego long enough to do that, perhaps you should not be 
answering questions.

Pete
0
Peter
7/1/2010 9:48:30 PM
It happens that Bill formulated :
> Hello
>
> I've got a C# console app, that calls a startup function in a C# dll that I 
> have created.  In my DLL, as I'm processing data, I want to display some 
> logging information, but I want to pass it back to the console app, and have 
> it write the text to the console as it comes from the DLL, but I'm not sure 
> how I should do this....
>
> Any suggestions, example
>
>
> Thanks

I would look into Log4Net if I were you.  It lets the application 
control where log messages end up via the config file.  You can also 
have them go to multiple places and set different levels.  It's an 
excelent logging library, IMHO.



-- 
Tom Shelton


0
Tom
7/1/2010 10:32:12 PM
Tom Shelton wrote:
> It happens that Bill formulated :
>> Hello
>>
>> I've got a C# console app, that calls a startup function in a C# dll 
>> that I have created.  In my DLL, as I'm processing data, I want to 
>> display some logging information, but I want to pass it back to the 
>> console app, and have it write the text to the console as it comes 
>> from the DLL, but I'm not sure how I should do this....
>>
>> Any suggestions, example
>>
>>
>> Thanks
> 
> I would look into Log4Net if I were you.  It lets the application 
> control where log messages end up via the config file.  You can also 
> have them go to multiple places and set different levels.  It's an 
> excelent logging library, IMHO.
> 
> 
> 

Enterprise Library has a nice logging application.
0
Mr
7/2/2010 12:19:48 AM
Reply:

Similar Artilces:

sbs 2008 console error
Good day, after the migration we have some problems with sbs 2008 console: we cannon't create the user with console. We can create with manual command. An exception of type 'Type: Microsoft.WindowsServerSolutions.Admin.Common.ADException, AdminCommon, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' has occurred. Timestamp: 03/09/2010 19:21:28 Message: La funzionalità Windows SBS Console non è stata configurata correttamente. Stack: in Microsoft.WindowsServerSolutions.Admin.Common.ProductADConstants.GetRolesDistinguishedName() ...

how to read app.config from a dll
I have the main project that where is my app.config. I have a project dll called Data, that must to read from the app.config that belongs the main project a string connection. When i debug thats returns null. How can i read my connection string. I�d like a sample or a link that i could download it. Thanks ...

System Management Console
Can someone tell me if there is a independent "exe" file for system management console for exchange that can be installed on windows xp machine? Thanks, R. Brown Hi R. Brown, check out the following link. It tells you how to install the Sys Mgr onto an XP box, and some of the pre-requisites etc. http://support.microsoft.com/default.aspx?scid=kb;en-us;815529 HTH, Katherine "R. Brown" <rbrown_nospam@rbnetworking.net> wrote in message news:YoU0c.564$rB4.178@bignews6.bellsouth.net... > Can someone tell me if there is a independent "exe" file for syste...

How to keep the printer driver DLL in memory?
Hi all, My application includes a third party component. Each time I ask it to draw the client area, it loads the default printer driver DLL. According to their developer, this is ensure that the image quality matches the printer, not the screen. However, when it finishes drawing, the driver DLL is unloaded. The load/unload takes much time and slows down the program. If my program loads the DLL and holds that reference, will Windows know the fact and not load from disk again? If so, which function should I call? Thanks in advance Sherwood ...

Filter/Display only certain rows of information based on a user na
Good Morning, I have a spreadsheet that contains a list of employee names (In Column "A") and information across a row related to them....Each employee is under 1 of 4 managers and what I need to do is have a way for the manager to log into the spreadsheet and only display the employees that is under them. Thank you in advance for your help, George Is the exclusivity down to confidential data or is it just to make it easy for the Managers to see their own staff? Is there a column that contains the Manager's name? If so and if confidential matter is not a p...

Problem running my app from boot up
Hi, I've written a "kiosk" application that the pc should boot up into. What i have done is replace the value of key :- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon from Explorer.ex to MyApp.exe. This works fine and pc boots straight into my application. The problem that i am having is that my application loads some text files for calibration purposes and it is not able to find these files. I have put these files in the same directory as the executable. When i double click on the exe to start it through explorer it picks up these files fine. Ho...

Console to Dialog
I'm trying to port a console based app to a dialog based app so that I can have access to gui controls. The console app connects to a remote server and process the data from the server through a dll. It does this by starting a thread which begins a session and handles the incoming data with callback functions. I tried porting by creating a regular dialog app with a button control that would start the main thread of the console app which I created a class for. I took out all references of creating or messaging the console window, so just the session/callback code remained. The dialog crash...

OLMAPI32.dll is blocking outlook, how do I fix?
dialogue box says OLMAPI32 is incompatible with MS Office 2007. Install outlook again. Can this be fixed any other way? Rename the file to .old and then run fixmapi.exe. -- Milly Staples [MVP - Outlook] Post all replies to the group to keep the discussion intact. ALWAYS post your Outlook version. How to ask a question: http://support.microsoft.com/KB/555375 After furious head scratching, jmklasvegas asked: | dialogue box says OLMAPI32 is incompatible with MS Office 2007. | Install outlook again. Can this be fixed any other way? ...

Staticly link with MSVCR71.dll ?
Hi: I'm using VC 7.1 on Windows XP. Is there a way to statically link the msvcr71.dll with my own dll so that I do not have to distribute msvcr71.dll to the user separately? Thanks Polaris I tried that once. I copied the msvcrt.lib from VC++ 6 to msvcrt6.lib, then in the project settings of VC 7.1, ignore default libs and added msvcrt6.lib instead of msvcrt.lib. It seems to work, but it may cause problems for certain type of apps. If you use the managed stuff, I wouldn't use the msvcrt6.lib. Your will link to msvcrt.dll. You cannot statically link the msvcr71.dll, but you ca...

MFC apps and multi video adapters
Hi, Can an mfc app be programmatically 'instructed' to use a specific video adapter? As far as I know I could use EnumDisplayMonitors(), GetMonitorInfo(), and CreateDC() to get a DC for a specific monitor. So, if I pass a given's monitor name which is attached to one of the video adapters I should be able to create a DC for that adapter. Is my assumption correct? If that works (i.e. creating a DC) then how would I associate it with mfc? Any other way to run an mfc app on a given video adapter? Thanks, Bogdan Why do you need a DC for the monitor? You wo...

Entering & displaying minutes & seconds (mm:ss) without hours
I need to record some readings in minutes and seconds. The time will never exceed 10 minutes. I would like to enter the data as "[m]m[:ss]", have it displayed as "m:ss", and stored as a numeric value. I'd prefer that it be stored in units of minutes, but the standard datetime value in day units is OK. Entered Displayed Value (minutes) 5:30 5:30 5.50000 1:5 1:05 1.08333 3 3:00 3.00000 :45 0:45 0.75000 If I enter "5:30", it is treated as 5 hours and 30 minutes and stored as 0.2291666 days. To get minutes and...

Exchange message console
Hi. I'm sorry to re-post this message, but i've loose the preceding answer. I've got a Windows SBS 2003 Server. Is there a console where I can see all mail (sender, recipients, message contents, ecc) which pass through my Exchange server? Inside and outside? I need to see every message that my employees send and receive. Thanks Hi Roberto Sounds like you need to implement message archival: http://www.msexchange.org/tutorials/MF011.html -- Neil Hobson Exchange MVP For Exchange news, links and tips, check: http://www.msexchangeblog.com "Roberto Sartori" <sa...

Display the TEXT of a comment in a new cell
Is there a way to display the comment, attached to a cell, as the 'value' of the cell? I have copied/pasted the comments to a new form (sheet) and would like to have the comment text displayed IN the new cell. Then I can print the sheet. My current macro copies all comments from one sheet and pastes them onto a second sheet. Now the new sheet shows the comment indicator, with a blank cell. I want to replace the blank cell, with the TEXT of the comment. Can this be done? Thank you in advance. JO Hi wojo, You could try this user-defined function placing it in a standard module...

How can I display incoming email messages
iN oUTLOOK 2007 I used to have incoming email messages outline displayed on my screen as they came in. How can I set this up i Win 7? "emcs jEAN" <emcs jEAN@discussions.microsoft.com> wrote in message news:9DE2D247-681D-4281-83AE-A2B1663A4634@microsoft.com... > iN oUTLOOK 2007 I used to have incoming email messages outline displayed on > my screen as they came in. > > How can I set this up i Win 7? Since it's an Outlook setting and has nothing to do with WIndows, you set it up exactly the same way you did before. It's a"desktop ...

Output to console
I am programming a replacement on-screen keyboard. This is a win32 program that needs to send messages to other windows. We use SendInput to send the keyboard messages to the window with the focus. This works for normal windows. It does not, however, work for sending output to a console window. Does anyone know how I can send characters to a console window? Dave ...

Opinions , info ...
Hello, I would like to ask the following question. Now, we have several company's with there own e-mail suffix for example test@company1.be , test@company2.pl , test@company3.fr , and there own local provider and IT infrastruture. What we would like is that all these company's get an e-mail address like @company.com. What is the easiest way to do this ? Can we use a pop3 server ? The company with .pl use there own exchange now but aren't connected to the main facility. Thx for the info ...

App file size
I have a spreadsheet application that has many report pages with lookup formulas that read data for several storage sheets. The storage sheets are populated by VBA that lays a row of data and deletes the 1st row of data to maintain a usable file size. This process is done daily. The file should'nt grow in size, but it does (slightly--5 - 6K daily) and has for nearly 2 years. How can this happen if the same amount of data is being deleted as added? Thanks, Sam Sam It can grow as Excel doesn't reset the used range very nicely. See Instructions for resetting used range on sh...

Display scrolling
Have a problem with one workbook. When the arrow keys are used to navigate vertically to a cell outside of the window area, the display does not scroll. The correct cell is selected; it just remains off screen. Horizontal navigation is OK, ie the display scrolls horizontally to keep the cursor in the window. I can't find any reference to this phenomenon in the help or KB. Does anyone know how to fix it? TIA Paul Have you checked to see if the window is frozen? I use a similar method the force users to stay on the certain pag until they have entered certain data. hth Mik --...

GetIUMS.dll from CiceroUIWndFrame
I get six identical messages when I open Outlook saying that MsDART.dll can't be found. Have reinstalled. Anyway to remove this message? I checked on Microsoft's DLL Helpbase (you may need to fix the wrap on the link below to use it): http://support.microsoft.com/default.aspx?scid=/servicedesks/fileversion/dllinfo.asp&SD=TECH&FR=0 and I found that the MSDART.DLL is: Microsoft Data Access - OLE DB Runtime Routines Not much help, but definately something to do with a database... Then I looked up GetIUMS on Google. I found many folks with this error. Some WXP most pertaini...

RWW Display Issues
Every time I connect to the server or desktops from my Windows 7 laptop via RWW, the remote window is cropped - to view the edges I must use scroll bars. This happens no matter what screen size I choose in options - from smallest to full screen. When I connect via default.rdp, the window has no scroll bars. What setting is needed to make the (more convenient for remote) RWW interface display properly? -- Thanks. Sammie SBS 2003, OFFICE 2007, Windows 7, IE8 From another forum.... ------------------------------------- I had the same issue - turns out it's the zoom le...

Console app with no console window
I'm trying to replace our fairly crappy scheduler with the NT Task Scheduler to run a console app. When our scheduler runs this app, it does so with no console window and the app then closes its standard in/out handles. Our scheduler calls CreateProcess() and sets the flag parameter to DETACHED_PROCESS. The command line for the console app includes a /d switch to tell it to close its IO handles. How would I get the same behaviour when running the console app from the NT Task Scheduler? I've looked at the interface for the task object and can't see anything there that would stop t...

Print spooler sub system App stopped working
Hi, I have a problem with my printer. I am getting a message saying that the spooler subsystem has stopped working and closed. I have tried manually restarting the spooler but I then get a interactive services message, saying that there is a message that cannot be viewed in windows, I click the view message button and I get a blue screen with a black window then I am told the it does not need to show me the message. I am running Vista SP2 64bit AMD athlon 64X2 Dual core processor 6400+ 3.20GHz with 4.00Gb RAM Thanks in advance. Nig Wait for responses but Just FYI: ...

Dynamically inserting popup menu into MDI app when there's a CView
I have an MFC MDI app. It has the standard IDR_MAINFRAME main menu, and one type of CView defined with its own IDR_AITYPE menu. Now I have to detect whether a custom DLL is loaded, and if so an extra popup menu is added to the main menu, defined & controlled from the DLL. I can modify the IDR_MAINFRAME menu from the mainframe's OnCreate handler. I call the DLL, which loads the custom menu resource & does an InsertMenu into the window's menu. This works well. But I can't figure out how (or where) to insert the popup menu into the main menu when a CView is active & re...

Adding Backup and Security Status to Windwos SBS Console
Backup Status; It is possible to add the same Backup Status notification to a second server? Or maybe a client machine that you are using Windows based backup? Security Status; I would assume that I need to enable the firewall rule for the severs to have the the Security Status change from "Not Available" to OK correct? Or is there a fix for this? I tried to search for threads and couldn't find anything. Kev wrote: > Backup Status; > It is possible to add the same Backup Status notification to a second > server? Or maybe a client ma...

i cant display field list in pivot table
i cant display the field chooser in pivot table What version of Excel are you using? Do you see the field list for other pivot tables? Cesar wrote: > i cant display the field chooser in pivot table -- Debra Dalgleish Excel FAQ, Tips & Book List http://www.contextures.com/tiptech.html ...