我一直在试验C++/CLI委托(因为我正在尝试创建一个.NET参考库),我遇到了以下问题.
我在C++/CLI中定义委托,然后在C#中创建委托的实例,然后通过非托管C++通过函数指针调用委托的实例.这一切都按预期工作.
代码来说明这一点(首先是我的C#)
using System;
namespace TestProgram
{
class Program
{
static void Main(string[] args)
{
Library.Test.MessageDelegate messageDelegate = new Library.Test.MessageDelegate(Message);
Library.Test test = new Library.Test(messageDelegate);
test.WriteMessage();
Console.Read();
}
static void Message()
{
Console.WriteLine(1024);
}
}
}
Run Code Online (Sandbox Code Playgroud)
接下来我的托管c ++文件(Managed.cpp)
#include "Unmanaged.hpp"
#include <string>
namespace Library
{
using namespace System;
using namespace System::Runtime::InteropServices;
public ref class Test
{
public:
delegate void MessageDelegate();
internal:
MessageDelegate^ Message;
void* delegatePointer;
public:
Test(MessageDelegate^ messageDelegate)
{
delegatePointer = (void*)Marshal::GetFunctionPointerForDelegate(messageDelegate).ToPointer();
}
void WriteMessage()
{
Unmanaged::WriteMessage(delegatePointer);
}
}; …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我有一个错误"可能发现精度损失:int required:short".我理解错误意味着什么,但我只是想知道为什么我会得到它.当然函数应该返回一个short类型(我看不出如何可能有任何精度损失,代码应该返回一个16位整数).任何人都可以为我清理为什么以下代码似乎需要类型int?
static short a() {
short[] payload = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
short offset = 2;
return (payload[offset - 2] << 8 & 0xff00) + (payload[offset - 1] & 0xff);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我一直在尝试开发一个用于C#的C++/CLI库,我遇到了以下问题.如果我们将我的托管引用类如下:
namespace Library
{
using namespace System;
public ref class Test
{
internal:
String^ internalString;
public:
Test()
{
internalString = gcnew String("Hey There");
}
~Test()
{
}
};
public ref class TestImplement
{
public:
static String^ TestMessage(Test test)
{
return test.internalString;
}
};
}
Run Code Online (Sandbox Code Playgroud)
我的C#实现如下:
使用系统;
namespace AddProgram
{
class Program
{
static void Main(string[] args)
{
Library.Test test = new Library.Test();
Console.WriteLine(Library.TestImplement.TestMessage(test));
Console.Read();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误CS0570:该语言不支持"TestMessage"
据我所知,这是由于将类型Library.Test作为参数传递.我不明白为什么我收到此消息,我希望可以从我的参考库传递类型.
任何帮助,将不胜感激
open SFML.Graphics
open SFML.Window
let window = new RenderWindow(new VideoMode(200u, 200u), "SFML works!")
let shape = new CircleShape(10.0f, FillColor=Color.Green)
let mutable pressedKey = Keyboard.Key.Unknown
let moveKeys = [ Keyboard.Key.Up; Keyboard.Key.Left;
Keyboard.Key.Down; Keyboard.Key.Right ]
let keyPress (e : KeyEventArgs) =
match e.Code with
| moveKeys -> pressedKey <- e.Code
| _ -> pressedKey <- Keyboard.Key.Unknown
let keyRelease (e : KeyEventArgs) =
let pressedKeys = List.filter (fun key -> Keyboard.IsKeyPressed(key)) moveKeys
if pressedKeys.IsEmpty then pressedKey <- Keyboard.Key.Unknown
else pressedKey <- pressedKeys.Head
window.Closed.Add(fun …Run Code Online (Sandbox Code Playgroud) def a: Int = {
for(i <- Array(1,2,3,4,5)){
if(i == 3)
return i
}
}
Run Code Online (Sandbox Code Playgroud)
上面的方法不会编译,我得到以下错误:
error: type mismatch;
found : Unit
required: Int
for(i <- Array(1,2,3,4,5)){
^
Run Code Online (Sandbox Code Playgroud)
预期的行为是该方法返回3.我的代码有什么问题?