我有两个程序.一个是C#,另一个是Java.这些程序很可能总是在同一台机器上运行.
什么是让他们互相交谈的最佳方式?
所以,澄清问题:
这是一个个人项目(所以专业/昂贵的图书馆是不行的).消息量很低,每秒大约有1到2条消息.消息很小,一些原始类型应该可以解决问题.我想保持低复杂性.java应用程序作为单个jar部署,作为另一个应用程序的插件.所以我必须合并的外部库越少越好.我完全可以控制C#应用程序.如前所述,两个应用程序都必须在同一台计算机上运行.现在,我的解决方案是使用具有某种类似csv格式的套接字.
我正在寻找这两种语言的多语言编程指南.
我知道它们之间的互操作是可能的,因为它们都在同一个Java VM上运行,并且都被编译为相同的字节码.但有一些麻烦:
(是的,是的,我知道我可以用一种语言插入jar来投射其他语言.)
所以问题是如何在Scala和Clojure中设置多语言开发?
我在C++中有以下结构:
#define MAXCHARS 15
typedef struct
{
char data[MAXCHARS];
int prob[MAXCHARS];
} LPRData;
Run Code Online (Sandbox Code Playgroud)
我正在调用一个函数来获取这些结构中的3个数组:
void GetData(LPRData *data);
Run Code Online (Sandbox Code Playgroud)
在C++中我会做这样的事情:
LPRData *Results;
Results = (LPRData *)malloc(MAXRESULTS*sizeof(LPRData));
GetData( Results );
Run Code Online (Sandbox Code Playgroud)
它会工作得很好,但在C#我似乎无法让它工作.我已经像这样创建了一个C#结构:
public struct LPRData
{
/// char[15]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
public string data;
/// int[15]
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 15)]
public int[] prob;
}
Run Code Online (Sandbox Code Playgroud)
如果我初始化其中3个(及其所有子数组)的数组并将其传递给此:
GetData(LPRData[] data);
Run Code Online (Sandbox Code Playgroud)
它成功返回,但LPRData数组中的数据没有更改.
我甚至尝试创建一个大小为3 LPRData的原始字节数组,并将其传递给函数原型,如下所示:
GetData(byte [] data);
但在这种情况下,我将从第一个LPRData结构中获取"数据"字符串,但在此之后没有任何内容,包括来自同一LPRData的"prob"数组.
有关如何妥善处理此问题的任何想法?
如何在Clojure程序中加载程序资源,如图标,字符串,图形元素,脚本等?我使用的项目布局类似于许多Java项目中的项目布局,其中"资源"目录悬挂在"源"目录之外.从源创建一个jar文件并包含资源,但我似乎无法像在Java中那样加载资源.
我尝试的第一件事就像是
(ClassLoader/getSystemResource "resources/myscript.js")
Run Code Online (Sandbox Code Playgroud)
但永远找不到资源.
你可以做类似的事情
...
(let [cls (.getClass net.mydomain.somenamespace)
strm (.getResourceAsStream cls name) ]
...
Run Code Online (Sandbox Code Playgroud)
其中name是name要加载的资源,但是流是nil.
您可以尝试使用类似的上下文类加载器
...
(let [thr (Thread/currentThread)
ldr (.getContextClassLoader thr)
strem (.getResourceAsStream ldr name)]
...
Run Code Online (Sandbox Code Playgroud)
但strem总是零.
令人沮丧的是,我尝试将资源文件放在程序的几乎每个目录中.它们被正确地复制到jar中,但我似乎仍然无法加载它们.
我已经查看了load函数和运行时库的语言源代码,但我没有"得到"它.
任何帮助,将不胜感激.
编辑:这是一个更具体的例子.在Java中,如果要将MarkDown转换为HTML,可以使用该showdown.js脚本并编写如下内容:
package scriptingtest;
import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Example {
private Object converter;
public String transformMarkDown(String markdownString) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try { …Run Code Online (Sandbox Code Playgroud) 我正在尝试将新工作表添加到Excel工作簿,并使其成为C#Excel Interop中书中的最后一个工作表.
看起来很简单,我认为下面的代码会这样做:
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var excel = new Excel.Application();
var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx");
workbook.Sheets.Add(After: workbook.Sheets.Count);
workbook.Save();
workbook.Close();
Marshal.ReleaseComObject(excel);
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有这样的运气.我收到这个有用的错误:
COMException未处理 - 来自HRESULT的异常:0x800A03EC
我在Microsoft.com上找到了这个页面,建议我先尝试添加表单,然后移动它,所以我尝试了如下所示.我知道这个网页的目标是Excel 95,但VBA仍然可以使用,所以我希望它仍然可以工作:
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var excel = new Excel.Application();
var workbook = excel.Workbooks.Open(@"C:\test\Test.xlsx");
workbook.Sheets.Add();
workbook.Sheets.Move(After: workbook.Sheets.Count);
workbook.Save();
workbook.Close();
Marshal.ReleaseComObject(excel);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我知道有很多CUDA语言绑定,比如PyCUDA,但是.Net 有什么好的绑定吗?我见过的唯一一个是这个,但我想知道是否还有其他人.
我有一个java.util.HashMap对象m(调用Java代码的返回值),我想获得一个带有附加键值对的新映射.
如果m是Clojure地图,我可以使用:
(assoc m "key" "value")
Run Code Online (Sandbox Code Playgroud)
但试着这样做HashMap:
java.lang.ClassCastException:java.util.HashMap无法强制转换为clojure.lang.Associative
没有运气seq:
(assoc (seq m) "key" "value")
Run Code Online (Sandbox Code Playgroud)
java.lang.ClassCastException:clojure.lang.IteratorSeq无法强制转换为clojure.lang.Associative
我设法做到的唯一方法是使用HashMap自己的put,但返回void所以我必须明确返回m:
(do (. m put "key" "value") m)
Run Code Online (Sandbox Code Playgroud)
这不是惯用的Clojure代码,m而是我正在修改而不是创建新的地图.
如何HashMap使用更多Clojure-ish方式?
interop clojure hashmap purely-functional clojure-java-interop
不久前,我在Visual Studio beta 1中编写了一些Word互操作示例,并将引用设置Microsoft.Office.Interop.Word为嵌入(在引用属性中设置"嵌入互操作类型"= true).这些工作正常,我暂时没有运行它们......直到今天.
当然,现在我在Visual Studio 2010和.NET 4.0的beta 2下运行 - 它似乎有点破碎.
这是有问题的代码(只是虚拟示例代码):
using Microsoft.Office.Interop.Word;
class WordImprovement1
{
static void Main()
{
Application app = new Application { Visible = true };
app.Documents.Add();
Document doc = app.ActiveDocument;
Paragraph para = doc.Paragraphs.Add();
para.Range.Text = "Thank goodness for C# 4";
object filename = "demo.doc";
object format = WdSaveFormat.wdFormatDocument97;
doc.SaveAs(FileName: ref filename, FileFormat: ref format);
doc.Close();
app.Quit();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我大多数情况下的例外情况,当"嵌入互操作类型"设置为"true"或我在命令行上使用"/ l"链接时:
System.MissingMethodException: Method not found:
'Void Microsoft.Office.Interop.Word._Application.set_Visible(Boolean)'.
at WordImprovement1.Main() …Run Code Online (Sandbox Code Playgroud) 我已经为COM互操作创建了一个.NET程序集,它在我的开发机器上运行良好.我目前正试图弄清楚如何使用Visual Studio的"安装项目"将DLL部署到目标机器.如何使用VIsual Studio安装项目执行以下操作:
regasm).
gacutil)
任何其他建议或关注将不胜感激.
我是C#的新手,我正在努力学习使用DLL.我正在尝试将我的对象包装在DLL中,然后在我的程序中使用它.
public class Foo // its in the DLL
{
public int ID;
public void Bar()
{
SomeMethodInMyProgram();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试将其打包到DLL但我不能,因为编译器不知道SomeMethodInMyProgram()是什么.
我想用它像:
class Program // my program, using DLL
{
static void Main(string[] args)
{
Foo test = new Foo();
test.Bar();
}
}
Run Code Online (Sandbox Code Playgroud)