Bitcoin Forum

Bitcoin => Mining software (miners) => Topic started by: wasabi on June 28, 2011, 02:48:31 AM



Title: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on June 28, 2011, 02:48:31 AM
New Bitcoin miner available.

http://github.com/wasabii/BitMaker

It's GPLv3, for now, until I come up with reasons to make it less restricted.

The majority of it is written in C#, including a purely managed miner component. There is an SSE miner component that is written in C++/CLI. This component won't run on Mono. The rest does. I'd like to fix that by using some P/Invoke instead of C++/CLI, but that's outside of the scope of my current interests.

I will be working on GPU support using Cloo, shortly. My goal with writing this was to have a flexible code base that I could use to deploy miners across my company's desktop, and maintain enough control over it to ensure that it doesn't disturb normal operations. Also: lulz.

One of the primary motivations with the GPU support will be it running as a Windows service, not on the user's desktop, so as not to interfere with the user's session. This will be interesting to do while still ensuring access to the GPU.

The architecture uses MEF to dynamically load miner plugins. Miner plugins advertise themselves as supporting certain resources (such as an instance of CpuResource). If two plugins can work with the same resource, the host tests both of them and chooses the one with the best hash rate. This is kind of silly right now with only a ManagedMiner and a SseMiner, which of course both use a CPU, and one being a clear winner. It might make more sense as I start filling in GPU support, and building different kernels for different brands and models of GPUs. Or maybe it's overkill. Either way: lulz.

No long pull support yet. That should be simple to add, and I'll be on it shortly. I've been testing against Slush's pool, so it hasn't really been something that I've bothered to do.

Anyways, the point for me is to deploy it across a heterogeneous range of desktops and servers, none of which I have the time or ability to make sure are all running the same GPUs, or same drivers. So the point of this project is to make sure one miner can figure out the best way to run on the box it lands on.

Anyways, enjoy. If there are any .Net developers out there that have been looking for a miner to fart with, this might be it.

UPDATE

GPU support added. Basically using Diablo's kernel for now. Not a whole lot is configurable, and I'm thinking of keeping it that way. I already have a framework in place to auto select the best miner for a particular piece of hardware, so I'd like to extend that to automatically try various work size, vector, etc, settings, and pick the option that results in the best performance.

Now that that works, I'm going to start working on splitting the GPU stuff off into a separate process, and communicating with it using IPC. I have code that will let me, from a service running in Session 0, spawn processes in other sessions, such as on the logon screen, or the logged in user's session. This will allow me to access the GPU from a service.

Long Poll support added.

Now supports failover pools.

RELASE

https://github.com/wasabii/BitMaker/downloads

Edit BitMaker.Console.exe.config to set your pool url, for now.


Title: Re: New .Net Miner (CPU only so far)
Post by: xane on June 28, 2011, 02:54:54 AM
Great work. Been waiting for something like this.


Title: Re: New .Net Miner (CPU only so far)
Post by: hawks5999 on June 28, 2011, 04:05:39 AM
1. package this in sccm or $package_management_tool and deploy across a bank or other FI.
2. have the bank's computers mining bitcoins.
3. ??????
4. Profit!





5. Go to jail.


Title: Re: New .Net Miner (CPU only so far)
Post by: PcChip on June 28, 2011, 04:06:54 AM
Anyways, the point for me is to deploy it across a heterogeneous range of desktops and servers, none of which I have the time or ability to make sure are all running the same GPUs, or same drivers. So the point of this project is to make sure one miner can figure out the best way to run on the box it lands on.

Sounds perfect for a botnet owner!


But seriously, awesome work, sounds like it could be useful to people who own large corporations and want to deploy it to all their employees computers, but not interrupt their work


Title: Re: New .Net Miner (CPU only so far)
Post by: jdebunt on June 28, 2011, 06:51:36 AM
this proejct definitely shows some great potential, and i'll gladly beta test it as soon as the GPU bit is working :)


Title: Re: New .Net Miner (CPU only so far)
Post by: wasabi on July 01, 2011, 05:21:20 PM
GPU support added.


Title: Re: New .Net Miner (CPU only so far)
Post by: SgtSpike on July 01, 2011, 05:23:15 PM
1. package this in sccm or $package_management_tool and deploy across a bank or other FI.
2. have the bank's computers mining bitcoins.
3. ??????
4. Profit!





5. Go to jail.
Hahaha, this.

Reminds me of the ABC guy who added the miner to their website.  :P


Title: Re: New .Net Miner (now with GPU!)
Post by: Naven on July 01, 2011, 06:46:27 PM
Will it work with NET 2.0 libraries?


Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 01, 2011, 07:01:54 PM
No. It uses Linq in a few places. 4.0 only.


Title: Re: New .Net Miner (now with GPU!)
Post by: Naven on July 01, 2011, 07:03:22 PM
Ok, gonna download VS10 and check how it works :)


Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 02, 2011, 01:03:14 AM
It's still a bit rough of course. I will say this, it is more of an "application" than any of the other miners out there. There's a number of different projects, generating different assemblies, for different components... and the miners are isolated from the main host that drives them, through interfaces and the stuff. It's an actual application, not just a single line script.

The central class is BitMaker.Miner.MinerHost. When you create an instance of this, and invoke Start, it looks up miner plugins, checks to see what resources they consume (CPU, GPUs, etc), and then runs them. If two miner plugins consume the same resource (say, there's an SSE SHA-256 hasher component, and a plain-C# managed hasher component), then it will run them both, check the hashes produced over some time period, and pick the fastest. It does this each launch. Which actually works okay. I'll probably cache this information away somewhere eventually.

BitMaker.Console is a console application that does little more than create a MinerHost and run it. It periodically queries this host for the hash rate, and displays it. Very simple. Not much more than that, yet. I hope for the miner host to eventually raise events about miners starting, stopping, hash rates changing, etc... so that the UI component (either the Console version, or a yet-to-be-produced WPF frontend) can display those as it sees appropriate.

I did this so I can debug the code using the Console version, which is easy to work with, but also host it in a Windows Service.

Right now I am working on restructuring the connections between the MinerHost and the Miner plugins. I'm adding the ability for a IMiner (the miner plugins) to indicate that it requires a Windows "console". That is, a user session that has the ability to access the graphics card. When this is set, the host will actually search the system for the active user session, with access to the GPU, and spawn the Miner in a sub process on that session, communicating back to the host. This way it will run without being logged in, or while switching users. It will basically keep running, regardless what the desktop is used for. If there's no user logged in, it will run on the WinLogon console (at the logon screen). In all cases, no UI will be shown. So, it will infiltrate user processes in order to gain access to the GPU. Thank you MS for not providing GPU access except for at the console.

All of this is designed so I can deploy it across my company's desktops, and regardless whether the user leaves their session logged off, or locked, or logged in, the GPU can be accessed.

Currently I'm running it on my office machines without using GPUs (we don't have any AMD GPUs in the office anyways), using the Windows 7 Task Scheduler, set to only run the BitMaker.Console application when the machine is idle, and to run it as Local Service. So it will do SSE hashing during idle time. It's been running quite well.

Configuration right now is in the App.config file. This obviously needs to move.


Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 02, 2011, 01:05:16 AM
I'm also an obsessive commenter, so it should be possible to follow the code. =)


Title: Re: New .Net Miner (now with GPU!)
Post by: Naven on July 02, 2011, 05:28:39 AM
@wasabi, could u give us a bin and some instructions how to use it.


Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 02, 2011, 03:51:30 PM
Eventually.


Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 04, 2011, 08:59:06 PM
Just added Long Poll support.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 04, 2011, 09:02:31 PM
I uploaded a built version.

https://github.com/wasabii/BitMaker/downloads

Edit BitMaker.Console.exe.config to set your pool url.


Title: Re: New .Net Miner (now with GPU!)
Post by: yigga on July 05, 2011, 06:45:27 AM
@wasabi, could u give us a bin and some instructions how to use it.
+1



Title: Re: New .Net Miner (now with GPU!)
Post by: wasabi on July 05, 2011, 04:38:57 PM
@wasabi, could u give us a bin and some instructions how to use it.
+1



Already did it. Before you posted +1.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Nachtwind on July 05, 2011, 11:05:55 PM
Nice project, but i cant compile it (using VS2010) Something about the platform. Do you have any special SDKs linked?


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: XIU on July 05, 2011, 11:44:02 PM
Looking good, following this thread :D


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 06, 2011, 01:03:10 AM
Nice project, but i cant compile it (using VS2010) Something about the platform. Do you have any special SDKs linked?

Mind giving me the exact message? My guess is you aren't on 64 bit Windows. Which is required. I didn't bother to write a 32 bit version of the SSE crud.

I should probably fix this and just leave SSE disabled.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Nachtwind on July 06, 2011, 06:58:04 AM
Oh nevermind. it was late last night i tried to compile - i havent had the Platform SDK installed. Everything is working now. Looks great :0)


Title: Re: New .Net Miner (now with GPU!)
Post by: entens on July 06, 2011, 02:16:13 PM
No. It uses Linq in a few places. 4.0 only.
Will it work with NET 2.0 libraries?

Actually it should be possible to backport to NET 3.5 and into Visual Studio 2008 as the only NET 4.0 dependency ('System.Componentmodel') could be either replaced with MEF or worked around. I'll take a better look at the scope of changes later tonight.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 06, 2011, 03:15:59 PM
System.ComponentModel.Composition is MEF.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: entens on July 06, 2011, 06:03:21 PM
System.ComponentModel.Composition is MEF.

Exactly. Unless you steal the assembly out of the GAC, it is easier to resort to MEF rc3 for backporting.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 06, 2011, 07:20:52 PM
I guess I find myself not too interested in pulling this off, or polluting the code enough to accomplish it. Either way, you are going to be installing this software on other machines. Can either bundle .Net 4 with it, or do something like AOT it with Mono.

I'd be more interested in making it compatible with Mono.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: entens on July 07, 2011, 04:06:13 PM
I guess I find myself not too interested in pulling this off, or polluting the code enough to accomplish it. Either way, you are going to be installing this software on other machines. Can either bundle .Net 4 with it, or do something like AOT it with Mono.

I'd be more interested in making it compatible with Mono.

After looking at the code last night that was my general feeling also. Getting it to compile under Mono would be more groundbreaking than backporting to NET 3.5.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Nachtwind on July 07, 2011, 07:56:46 PM
ok.. late night question again: How to set what minerplugin to use - so wether it is GPU or CPU? I dont find the point where it does that..


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 08, 2011, 12:37:09 AM
You don't really yet. It loads and attempts to run every plugin it finds. If the .Gpu assembly is in the same folder as the .exe, it's tested, and runs.

If the .Sse assembly is there, it's tested and runs. Same with .Managed.

Step #1 for me was getting an actual working miner. Next steps are making the thing configurable, usable, etc. I had previously decorated the code with Console.WRiteLIne's for each plugin, so you could see what the hell was going on, but kind of removed them all.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: 1bitc0inplz on July 08, 2011, 01:24:56 AM
@wasabi

I see you said you used Cloo. How did you like that? I had looked at it previously for another project, and I was curious what your impressions were.

Keep up the good work, this is an interesting project for sure!


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 08, 2011, 01:38:43 AM
It's decent. It's a proper wrapping of OpenCL. There's a small annoyance with a memory leak of ComputeEvent's being generated even though you pass null as a event list for most calls. That's easy enough to solve by passing a list to put them in and disposing of them immediately though. The only thing really wrongn with it is a complete lack of documentation as far as I can see. That's fine though, since it's nothing but a loose wrapper over OpenCL itself.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 10, 2011, 04:04:21 PM
Okay. I now support multiple pools. The format of the .config file has changed.


    <bitmaker.miner>
        <pools>
            <add
                url="http://user:pass@host:8332/" />
            <add
                url="http://user:pass@host:8332/" />
            <add
                url="http://user:pass@host:8332/" />
        </pools>
    </bitmaker.miner>


Each time a thread desires work, it starts at the top and works it's way down. So, the pool at the top, if it's working, is currently always used. If it fails, the next one is tried. Work gets submitted back to the correct pool.

Thinking of implementing some sort of priority classing and load balancing to that. Maybe poolGroup or something.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Zagitta on July 13, 2011, 04:40:55 AM
What speed are you seeing on the completly managed SHA256 hasher you've made compared to the one built into the .net libary?


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 13, 2011, 05:58:06 PM
What speed are you seeing on the completly managed SHA256 hasher you've made compared to the one built into the .net libary?

Don't know. Never tried the .Net one. I assume much faster. The .Net one's interface requires you to submit a byte[] of the data, which it no doubt has to split up internally into 64 byte blocks, and add the padding to. Additionally, when output, it probably reverses the endian. And thus it has to reverse it again when doing the second hash. And the second hash no doubt has to be copied, and padded, too. Also, I suspect that it probably uses CryptoAPI, so results in a P/Invoke.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Economics on July 13, 2011, 07:55:21 PM
I can't get the miner to log into deepbit.  It keeps giving me an authentication error.

Is anyone else having this problem?

--E


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Zagitta on July 13, 2011, 07:58:24 PM
What speed are you seeing on the completly managed SHA256 hasher you've made compared to the one built into the .net libary?

Don't know. Never tried the .Net one. I assume much faster. The .Net one's interface requires you to submit a byte[] of the data, which it no doubt has to split up internally into 64 byte blocks, and add the padding to. Additionally, when output, it probably reverses the endian. And thus it has to reverse it again when doing the second hash. And the second hash no doubt has to be copied, and padded, too. Also, I suspect that it probably uses CryptoAPI, so results in a P/Invoke.

You're probably right about the first part however i only think the non managed version in the .net framework uses P/Invoke, i mean why else would they also have a managed version?

http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256managed.aspx vs  http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.aspx


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 13, 2011, 09:15:30 PM
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256managed.aspx vs  http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.aspx

I've never even noticed this! Assumed you were talking about the SHA256 one. I'm still going to assume it's faster for all the same reasons minus the P/Invoke.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Furyan on July 15, 2011, 01:28:58 AM
Ok, this is very cool.  I was looking for someone who had done this. If you need help with this, give me a hollar.  There is a reason I may be an ideal coding partner on this, which I will share over PM if you're interested.

You beat me to it.  I was still on the OpenCL .NET wrapper step.  That said, I've only been looking into Bitcoin for 9 days :)

Next step:  .NET pushpool.

That may be my next "side" project...


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 15, 2011, 01:27:48 PM
Ok, this is very cool.  I was looking for someone who had done this. If you need help with this, give me a hollar.  There is a reason I may be an ideal coding partner on this, which I will share over PM if you're interested.

You beat me to it.  I was still on the OpenCL .NET wrapper step.  That said, I've only been looking into Bitcoin for 9 days :)

Next step:  .NET pushpool.

That may be my next "side" project...

Well there's work to be done on it, so just do it. ;)


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: XIU on July 15, 2011, 03:15:49 PM
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256managed.aspx vs  http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.aspx

I've never even noticed this! Assumed you were talking about the SHA256 one. I'm still going to assume it's faster for all the same reasons minus the P/Invoke.

Don't forget that on WinXP (yeah lol) only the Managed one is supported. We use the following code in our systems:

var sha256provider = Environment.OSVersion.Version.Major >= 6 ? new SHA256CryptoServiceProvider() : SHA256.Create();


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Furyan on July 15, 2011, 10:02:25 PM
Ok, this is very cool.  I was looking for someone who had done this. If you need help with this, give me a hollar.  There is a reason I may be an ideal coding partner on this, which I will share over PM if you're interested.

You beat me to it.  I was still on the OpenCL .NET wrapper step.  That said, I've only been looking into Bitcoin for 9 days :)

Next step:  .NET pushpool.

That may be my next "side" project...

Well there's work to be done on it, so just do it. ;)

Sweet. Any places you feel the code needs immediate attention? I'll probably screw around with it this weekend.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Zagitta on July 16, 2011, 12:28:15 AM
Ok, this is very cool.  I was looking for someone who had done this. If you need help with this, give me a hollar.  There is a reason I may be an ideal coding partner on this, which I will share over PM if you're interested.

You beat me to it.  I was still on the OpenCL .NET wrapper step.  That said, I've only been looking into Bitcoin for 9 days :)

Next step:  .NET pushpool.

That may be my next "side" project...

Already being worked on: https://github.com/Zagitta/Zetlon.Coinster :p


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 16, 2011, 01:49:15 AM
Sweet. Any places you feel the code needs immediate attention? I'll probably screw around with it this weekend.

Well, BFI_INT stuff needs to be added. That's pretty crappy to do though.

Most of the outstanding stuff I need to do requires a bit of rearch. I want to add support for running miner plugins out of process of the main program. Once that is in, the processes can be started and stopped dynamically in the Console session, so they have GPU access.

I need more events flowing from the miner processes up to the main program. They already expose Resources, which represent something like a CPU, or a GPU, but those Resources can be a bit more descriptive. Hash count tracking per-resource would be nice. Then, when the main program is getting events from all of the stuff it's running, the console UI can be updated a bit (maybe using curses stuff) to show exactly what's happening. What GPUs are running. What pools are running. What GPUs are working on work from what pool, etc.

I'd like a miner plugin factory to be able to, with a resource, also advertise possible run-modes of the miner. Such as work group size, vector modes, etc. This way, instead of the user having to specify what options he wants the program to use, it just tries them all during the test phase, and picks the fastest.

Pool configuration stored in some other structure than System.Configuration would be nice. Or maybe System.Configuration is fine, but it needs to be configurable at runtime. You need to be able to alter the pools at runtime... for a future WPF UI.



Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 16, 2011, 01:50:39 AM
I should also note that I'm kind of an architecture snob. I don't like hacks. I like clean, well designed code, with lots of separation between layers, and lots of comments. This is mostly just a for-fun project for me, so I will probably have strong opinions about how something should be designed. It's practice.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: PcChip on July 19, 2011, 06:54:38 AM
I edited both config files, and tried running both EXE's, and both crashed.

One had some information as it crashed, so I took a screenshot (it then proceeded to crash my display driver)

Hardware is an i5 Lynnfield that gets 15.5 MH/s on Ufasoft's SSE2 miner, and a GTX570 with ForceWare 275.50

https://i.imgur.com/tXIDU.png


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: wasabi on July 19, 2011, 03:36:02 PM
Hmm. I had this problem on a Windows Server 2008 box. I just did a little work, and I think it's a missing dependency for the C++ stuff.

I believe you need the Microsoft Visual C++ Runtime (x64) installed.

http://www.microsoft.com/download/en/details.aspx?id=14632

I might be wrong.


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Nachtwind on July 22, 2011, 10:45:16 AM
Hm... do i need something special to make it run with GPU?
Tried it on two machines, one with a 4670 and one with a 6850 - both gave me but 1.500kh - so i guess it was using only CPU...

Any ideas someone here?



*edit*
Bugreport:

After a while the program throws an exception: factory is "null"
Code:
        private IMiner StartMiner(IMinerFactory factory, MinerResource resource, IMinerContext context)
        {
            lock (syncRoot)
            {
                var miner = factory.StartMiner(context, resource); //here it throws it. Factory is NULL
                Miners.Add(new MinerEntry(miner, resource));
                return miner;
            }
        }


*edit2*
After changing the previous code to check wether factory is null or not i got INVALIDS and SOLUTIONS - but they dont get reported to my proxy or the pool. It also says it was using GPU - though i doubt that at 1 to 5 kh...


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: pennytrader on July 27, 2011, 02:27:50 AM
I'd like to support the .Net solution. I always want to write one but too lazy...


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: iopq on July 29, 2011, 06:02:07 PM
tried running it, just stuck on 0 mhash/s
any ideas? I'm running straight from the package, I edited my console.exe.config to

<?xml version="1.0"?>

<configuration>
    
    <configSections>
        <section
            name="bitmaker.miner"
            type="BitMaker.Miner.ConfigurationSection, BitMaker.Miner" />
    </configSections>

    <bitmaker.miner>
    <pools>
            <add
            url="http://iopq.me:***@mineco.in:3000/" />
     </pools>
    </bitmaker.miner>
</configuration>

running windows 7 64 bit


Title: Re: New .Net Miner (now with GPU and long poll!)
Post by: Furyan on August 12, 2011, 01:12:18 AM
Sweet. Any places you feel the code needs immediate attention? I'll probably screw around with it this weekend.

Well, BFI_INT stuff needs to be added. That's pretty crappy to do though.

Most of the outstanding stuff I need to do requires a bit of rearch. I want to add support for running miner plugins out of process of the main program. Once that is in, the processes can be started and stopped dynamically in the Console session, so they have GPU access.

I need more events flowing from the miner processes up to the main program. They already expose Resources, which represent something like a CPU, or a GPU, but those Resources can be a bit more descriptive. Hash count tracking per-resource would be nice. Then, when the main program is getting events from all of the stuff it's running, the console UI can be updated a bit (maybe using curses stuff) to show exactly what's happening. What GPUs are running. What pools are running. What GPUs are working on work from what pool, etc.

I'd like a miner plugin factory to be able to, with a resource, also advertise possible run-modes of the miner. Such as work group size, vector modes, etc. This way, instead of the user having to specify what options he wants the program to use, it just tries them all during the test phase, and picks the fastest.

Pool configuration stored in some other structure than System.Configuration would be nice. Or maybe System.Configuration is fine, but it needs to be configurable at runtime. You need to be able to alter the pools at runtime... for a future WPF UI.



Finally have gotten around to taking a look at this, now that my other stuff is more or less complete -

BFI_INT stuff - I'm guessing you say this is crappy because it requires doing brand detection, yes?  Being that it's supported on AMD/ATI cards you'd have to be sure to pass it only on those cards.

Miners running outside the main program - how do you feel about implementing a WCF service between them for communication?  It's a simple enough thing to do, although some might consider it a somewhat heavy-handed method of communication.