I've done that before a VB application. The client calls a MTS dll class method that has a return type of "Variant." The MTS method a) generates a Crystal report 2) reads the Crystal report file into a byte array using VB's "Get" function c) returns the byte array to the caller as the return value of the function.
Once the variant has returned to the client, it converts the variant back to a byte array and writes the byte array to a file locally using VB's "Put" function. You can then display the file in the Crystal Reports viewer control on a form. You could probably pass the byte array back using a Property Bag for better performance, but I have not yet tried that as of yet.
Here's an example:
MTS Function:
---------------------
Public Function GetReport() as Variant
Dim bteCrystalRpt() as Byte
Dim intFreeFile as Integer
Dim strTempFilename as String
' <Code that generates the Crystal
' report here...>
' *Assume the path to the Crystal
' report is held in the variable "strTmpFileName"
' Redimension the array to the size it will need
' to store the Crystal report.
ReDim bteCrystalRpt(FileLen(strTmpFileName) - 1) As Byte
' Open the Crystal report file.
intFreeFile = FreeFile
Open strTmpFilename For Binary Access Read As #intFreeFile
' Get the contents of the file into a byte array
Get #intFreeFile, , bteCrystalRpt
' Close the file and delete it.
Close #intFreeFile
' Clean up...
Kill strTmpFilename
Erase bteCrystalRpt
' Return the byte array as a variant
' to the client.
GetReport = bteCrystalRpt
End Function
Client Function:
--------------------------
Private Sub GoGetReport()
Dim X as SampleDLL.ReportMaker ' your MTS class object
Dim vntCrystalRpt as Variant
Dim bteCrystalRpt() as Byte
Dim intFreeFile as Integer
' Call the MTS function to retrieve
' the Crystal report as a variant.
Set X = CreateObject("SampleDLL.ReportMaker"

Set vntCrystalRpt = X.GetReport()
' Convert the variant to a byte array
' before you write it to disk, or Crystal
' will have errors trying to open the file.
bteCrystalRpt = vntCrystalRpt
' Now write the byte array to disk
Open "C:\MyReport.rpt" For Binary As #intFreeFile
Put #intFreeFile, , bteCrystalRpt
Close #intFreeFile
' Clean up...
Erase bteCrystalRpt
Set vntCrystalRpt = Nothing
' <Code to bring the Crystal Reports file
' into the Crystal viewer control here>
End Sub